rust枚举模式

0. 枚举模式

在rust中,枚举通常表达了特定的语义,深刻的嵌入到rust语言中,作为语言密不可分的一部分。对于这些枚举,我把他归结出来作为rust的枚举模式。

什么事枚举模式?它有如下特征

  • 特征一、枚举表达语义,语义是第一位的,例如Option的两个枚举值,一个代表控制,一个代表可能值
  • 特征二、枚举是泛型的,有1个多个泛型值定义
  • 特征三、泛型值可能有约束,例如说Cow,意味着只有实现了约束的值才能实现Cow
  • 特征四、有自定义的函数,例如impl<T> Option<T> {}
  • 特征五、关键库中作为函数的返回值

按照这些特征我们来学习几个和rust语言深度嵌入的枚举模式

1. Option枚举

如下为Option的定义

pub enum Option<T> {
    /// No value.
    None,
    /// Some value of type `T`.
    Some(T),
}

按照枚举模式的特征思考总结:

  • 特征一、Option表达的是可选的语义,没有值就是None,有值就是Some(T).
  • 特征二、泛型枚举,泛型值是T
  • 特征三、无枚举约束,可以涵盖所有类型及自定义类型
  • 特征四、自定义的函数,Option定义了一系列的函数
    • 枚举值判断,is_none、is_some
    • 类型转换,as_deref、as_deref_mut、as_mut、as_pin_mut、ok_or、ok_or_else(转result类型)、
    • 获取值,get_or_insert、get_or_insert_default、get_or_insert_with、cloned、copyed、unwraper、unwraper_or、unwraper_or_default、unwraper_or_else
    • 函数式函数,filter、map、map_or、map_or_else、flattern、take、unzip、zip、zip_with
    • 迭代函数: iter、iter_mut
    • 关系函数:and、and_then、or、or_else
    • 特殊函数:expect(设置Panic返回)、replace
  • 作为函数返回值:例如所有的collection的取值,例如Vec类Pop、first、last、get、take

2. Result枚举

如下为Result的定义

pub enum Result<T, E> {
    /// Contains the success value
    Ok(T),

    /// Contains the error value
    Err(E),
}

按照枚举模式的特征思考总结:

  • 特征一、Result表达的语义是异常处理机制,正常就是Ok(T),异常就是Err(E).
  • 特征二、泛型枚举,Result有2个泛型定义,T和E
  • 特征三、无枚举约束,可以涵盖所有类型及自定义类型
  • 特征四、自定义的函数,Result定义了一系列的函数
    • 枚举值判断,is_err、is_err_and、is_ok、is_ok_and
    • 类型转换,as_deref、as_deref_mut、as_mut、as_ref、ok(转Option类型)、
    • 获取值,cloned、copyed、unwraper、unwraper_or、unwraper_err、unwraper_err_default、unwraper_or、unwraper_or_else、unwraper_or_default、
    • 函数式函数,map、map_or、map_err、flattern
    • 迭代函数: iter、iter_mut
    • 关系函数:and、and_then、or、or_else
    • 特殊函数:expect、expect_err
  • 作为函数返回值:例如fs文件操作,copy、read、write的返回都是result

3. Cow枚举

如下为Cow的定义

pub enum Cow<'a, B: ?Sized + 'a>
where
    B: ToOwned,
{
    /// Borrowed data.
    Borrowed(&'a B),

    /// Owned data.
    Owned( <B as ToOwned>::Owned),
}

pub trait ToOwned {
    type Owned: Borrow<Self>;

    /// Creates owned data from borrowed data, usually by cloning.
    fn to_owned(&self) -> Self::Owned;

    /// Uses borrowed data to replace owned data, usually by cloning.
    fn clone_into(&self, target: &mut Self::Owned) {
        *target = self.to_owned();
    }
}

按照枚举模式的特征思考总结:

  • 特征一、Cow表达的语义写时拷贝,引用定义是Borrowed,持有值定义是Owned
  • 特征二、泛型枚举,定义泛型B
  • 特征三、有枚举约束,泛型B必须实现 ToOwned trait,B类型可以是str、CStr、OsStr、path、[T]
  • 特征四、自定义的函数,Result定义了一系列的函数
    • 枚举值判断,is_owned、is_borrowed
    • 类型转换,into_owned、to_mut
  • 作为函数返回值:主要是满足泛型B约束,在操作中延迟写

4 小结

在其它语言中,枚举很少有这样的关键语言角色,把语言中的枚举作为模式并按这样的思维套路来学习模仿,有事半功倍的效果。

枚举模式背后的逻辑是每种语言的思维不一样,学习语言也在学习背后的思维逻辑。

类似的例子还有《rust所有权:Move、Copy、Borrow语义》的总结“rust所有权是基础,背后的逻辑是相对于其它语言需要增加的一个思维环节,如果写代码的时候不思考这个环节,写出来的代码编译不过的概率很大,会经常在这里跌跤子”。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容