1. 简介
Option 是 Rust 语言中的一个枚举类型,它表示一个值可能存在,也可能不存在的情况。在Rust中没有空值null
关键字,而改为使用Option枚举来处理。通过这种方式,可以解决很多问题,比如判断一个值是否为空,避免空指针引用
等。
Option 枚举包含两个成员,一个成员表示含有值:Some(T), 另一个表示没有值:None,定义如下:1
2
3
4enum Option<T> {
Some(T),
None,
}
由于Optionprelude
( prelude
属于 Rust 标准库,Rust 会将最常用的类型、函数等提前引入其中自动导入)中,在使用时不用提前导入,直接使用即可。
2. 解构 Option
2.1. match
通过 match 表达式来判断 Option 中是否存在值,并进行相应的处理。1
2
3
4
5
6
7fn main() {
let a = Some(10);
match a {
Some(num) => println!("{}", num),
None => println!("{}", false)
}
}
2.2. if let
使用if-let 语法糖,在 if condition 的语法规则下,在 condition 部分进行 let 语句的模式解构,匹配上则执行 dosomething。if-let 和 match 的区别是,前者只关注某个感兴趣的特定分支,后者则必须完整匹配。1
2
3
4
5
6
7
8
9
10fn main() {
let a = Some(10);
if let Some(num) = a {
let b = 8;
let all = num + b;
println!("{}", all);
} else {
println!("{}", false)
}
}
2.3. unwrap
unwrap()方法不安全,但操作方便,如果目标值为 None,会引起 panic!1
2
3
4
5fn main() {
let a = Some(10);
let a_value = a.unwrap();
println!("{}",a_value); // 如果a为None时,会引发panic
}
2.4. unwrap_or
相对unwrap(),较为安全。若是出现提取失败(目标为 None),则使用参数代替输出。
类似方法还有unwrap_or_else(),unwrap_or_default()1
2
3
4
5
6fn main() {
// let a = Some(10);
let a = None;
let a_value = a.unwrap_or(100);
println!("{}",a_value); // 输出默认值100
}
2.5. take
take方法可以从Option中取出值,并将 Option 中的值设置为 None,但原来的变量还有效(但实际上没什么用处了,因为只剩下None了),take方法的原始值或者引用必须为mut类型。1
2
3
4
5
6
7
8
9fn main() {
let mut a: Option<i32> = Some(5); // 去掉mut时报错;
let a_value = a.take();
println!("The value is {:?}", a);
println!("The new Option is {:?}", a_value);
}
// The value is None
// The new Option is Some(5)
3. 总结
- 对于逻辑上会存在空值的变量,应该显式声明其类型为 Option
,否则应直接声明为 T 类型。 - 不要轻易使用 unwrap 方法,它可能会导致程序发生 panic。因为 unwrap 方法是从 Option
中提取出 T,若 T 的类型为 None,则会触发 panic。一定要用也推荐用 expect, 至少 panic 时会有错误信息。 - Option 包装的指针类型执行效率不会降低,即“零开销抽象”。
4. 参考信息
Enum std::option::Option
Rust语言圣经(Rust Course)
Rust的模式解构 & 再谈 Option 类型
Rust语言从入门到精通系列 - Option特征那些事儿