03.Rust学习-解构Option

1. 简介

Option 是 Rust 语言中的一个枚举类型,它表示一个值可能存在,也可能不存在的情况。在Rust中没有空值null关键字,而改为使用Option枚举来处理。通过这种方式,可以解决很多问题,比如判断一个值是否为空,避免空指针引用等。

Option 枚举包含两个成员,一个成员表示含有值:Some(T), 另一个表示没有值:None,定义如下:

1
2
3
4
enum Option<T> {
Some(T),
None,
}

由于Option 枚举被包含在prelude ( prelude属于 Rust 标准库,Rust 会将最常用的类型、函数等提前引入其中自动导入)中,在使用时不用提前导入,直接使用即可。

2. 解构 Option

想获取 Option 当中的T,可以有以下几种方式:

2.1. match

通过 match 表达式来判断 Option 中是否存在值,并进行相应的处理。

1
2
3
4
5
6
7
fn 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
10
fn 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
5
fn 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
6
fn 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
9
fn 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特征那些事儿

-------------本文结束感谢您的阅读-------------

本文标题:03.Rust学习-解构Option

文章作者:Fangj

发布时间:2024年01月24日 - 22:01

最后更新:2024年01月24日 - 22:01

原始链接:https://biofang.github.io/2024/01/24/03-Rust学习-解构Option/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。