rust中,Option表示一个可能不存在值的复合类型。其定义如下
pub enum Option<T> {
None,
Some(T),
}
可以看到,它里面的值要么就是类型T的值,要么就是None(也表示不存在值)。通常,我们在获取到可能为空的值时,Option类型很有用,它要求你必须去处理可能为None的情况。它有方法 is_none, is_some 等,可以判定是否为空。但是如果你使用这两个方法来解包 Option,免不了if else判断,代码会比较难看。比如
let x: Option<u32> = Some(2);
let mut value: u32 = 0;
if x.is_none() {
value = default;
} else {
value = x.unwrap(); // unwrap 方法可以解一切包,但是遇到 None 会 panic
}
可以看到上面的代码用了2条语句,首先是初始化value值,然后判定是否为None,根据不同的情况,对value重新赋值,明显复杂,我解个Option还得分两步,而且申明的value还必需是mut类型。那么,对于“我需要解包Option,如果Option为None则给默认值”这个需求,有更优雅的写法吗?有,如下
let x: Option<u32> = Some(2);
// 方法一:利用 match,和语句块
let value = match x {
Some(val) => val,
None => default,
};
// 方法二:利用 if-let,和语句块
let value = {
if let Some(val) = x {
*val
} else {
default
}
};
上述两种方法都是借助语句块一步到位的解包Option,并且没有调用任何方法。