Rust语言之Option枚举类型
概述
Option是Rust语言设计中最重要的枚举类型之一,它编码了其它语言中空值与非空值的概念,差异在于,Rust不会允许你像其它语言一样以非空值的方式来使用一个空值,这避免了很多错误。Option在标准库中的定义如下:
pub enum Option<T> {None,Some(T),
}
Option枚举使用了泛型类型参数,这表示Option的Some成员可以包含任意类型的数据,同时如果类型参数T实现了Copy trait,那么Option也就实现了Copy trait。
修改Option内部存储的值
由于Option类型将真正的数据存储到了内部,因此需要通过模式进行内部存储数据的修改,下面示例展示了常用的基于模式的修改方式,另外通过Option类型提供的一些方法也可以达到修改的目的,例如take/replace,我们会在后面提及。
let mut x = Some(34);// 方式一
match &mut x {Some(v) => *v = 42, // 等价于&mut Some(ref mut v)None => {},
}
assert_eq!(x, Some(42));// 方式二
match x {Some(ref mut v) => *v = 47,None => {},
}
assert_eq!(x, Some(47));
Option的常用方法
is_none方法
is_none方法检查option的值是否是None,原型定义如下:
pub const fn is_none(&self) -> bool
使用示例:
let x: Option<u32> = Some(2);
assert_eq!(x.is_none(), false);let x: Option<u32> = None;
assert_eq!(x.is_none(), true);
as_ref方法
as_ref方法将&Option转换成Option<&T>,原型定义如下:
pub const fn as_ref(&self) -> Option<&T>
as_mut方法
as_mut方法将&mut Option转换成Option<&mut T>,原型定义如下:
pub fn as_mut(&mut self) -> Option<&mut T>
使用示例:
let mut x = Some(2);
match x.as_mut() {Some(v) => *v = 42,None => {},
}
assert_eq!(x, Some(42));
take方法
take方法从option取出值,原option值修改成为None,原型定义如下:
pub fn take(&mut self) -> Option<T>
使用示例:
let mut x = Some(2);
let y = x.take();
assert_eq!(x, None);
assert_eq!(y, Some(2));let mut x: Option<u32> = None;
let y = x.take();
assert_eq!(x, None);
assert_eq!(y, None);
replace方法
replace方法从option取出值,同时使用指定值修改原option值,原型定义如下:
pub fn replace(&mut self, value: T) -> Option<T>
使用示例:
let mut x = Some(2);
let old = x.replace(5);
assert_eq!(x, Some(5));
assert_eq!(old, Some(2));let mut x = None;
let old = x.replace(3);
assert_eq!(x, Some(3));
assert_eq!(old, None);
unwrap方法
unwrap方法消费option值,返回Some内的数据,原型定义如下:
pub fn unwrap(self) -> T
使用示例:
let x = Some("air");
assert_eq!(x.unwrap(), "air");
关于Option的更多操作方法,可以参考Rust标准库:https://doc.rust-lang.org/std/option/enum.Option.html。
相关参考
- 《Rust程序设计》
- 《Rust程序设计语言》