ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Rust学习——枚举和模式匹配

2021-11-30 16:02:11  阅读:279  来源: 互联网

标签:None Option Rust 枚举 let 模式匹配 Coin match


一、枚举(enums)
Rust中枚举由成员(variants)组成

枚举替代结构体优势:
1. 每个成员可以处理不同类型和数量的数据

结构体与枚举相似点:
1. 都可以使用impl定义方法
2. 方法体都使用self来获取调用方法的值

Rust没有空值(即Null),但Rust拥有一个可以编码存在或不存在概念的枚举(Option):
enum Option {
Some(T),
None,
}
Options枚举很有用,所以已内置在prelude中无需显示引入作用域。它的成员也不需要通过Option::前缀来使用,可直接使用Some和None。即使如此,成员依旧是成员。

若使用None而不是Some,则需要显示声明Option的类型,即传入具体T的类型,因为编译器只通过None无法推断Some成员保存值的类型。

在对 Option 进行 T 的运算之前必须将其转换为 T。
通常这能帮助我们捕获到空值最常见的问题之一:假设某值不为空但实际上为空的情况。

使用Option优点:
不再担心会错误的假设一个非空值,会让你对代码更加有信心。

二、控制流运算符(match)
与if表达式区别:if表达式必须返回一个bool值,而match中可以返回任意类型值。

一个match分支有两个部分:
1. 一个模式
2. 一些代码

  1. 绑定值的模式
    enum UsState {
    Alabama,
    Alaska,
    }
    enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter(UsState),
    }

fn value_in_cents(coin: Coin) -> u8 {
match coin {
Coin::Penny => 1,
Coin::Nickel => 5,
Coin::Dime => 10,
Coin::Quarter(state) => {
println!("State quarter from {:?}!", state);
25
},
}
}

调用 value_in_cents(Coin::Quarter(UsState: :Alaska))即可访问到值Alaska。

2.匹配Option
一个在 Option 上使用 match 表达式的函数:
fn plus_one(x: Option) -> Option {
match x {
None => None,
Some(i) => Some(i + 1),
}
}

let five = Some(5);
let six = plus_one(five);
let none = plus_one(None);

将 match 与枚举相结合在很多场景中都是有用的。

Rust中的匹配是穷尽的(exhaustive):必须穷举到最后的可能性来使代码有效。

3.通配符(
Rust提供一个模式用于不想列举出所有可能值的场景。
“ 模式会匹配所有的值,通过将其放置于其他分支之后,_ 会匹配所有之前没有指定的可能的值。

然而,match 在只关心仅一个分支的场景中显得啰嗦了,所以Rust提供了 " if let "。

三、简洁控制流(if let)
if let 获取获取通过等号分隔的一个模式和一个表达式。
使用if let 会失去 match 强制要求的穷尽性检查。
所以使用match 还是 if let 需要去权衡。

if let 可以包含一个else

标签:None,Option,Rust,枚举,let,模式匹配,Coin,match
来源: https://www.cnblogs.com/tim100/p/15624603.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有