Option是Rust的为了解决函数返回null问题而产生的。结构如下
pub enum Option<T> {
None,
Some(T),
}
正常返回Some(T),否则返回None。
举个栗子如下
fn main() {
let a=double(1);
let b=double(-1);
println!("a= {}",a.expect("@@@here is panic"));
println!("a= {}",a.unwrap());
//以下两行都会出错,一个unwrap得到的None,引发panic,一个是给panic做个自定义的标记,方便定位
//println!("a= {}",b.unwrap());
//println!("b= {}",b.expect("@@@here is panic")) ;
}
fn double(x:i32)->Option<i32>{
match x>0 {
false => None,
true => Some(x+x),
}
}
例子很简单,如果小于0抛出none,否则双倍输出。
1、unwrap内部对返回的Result进行了模式匹配,如果是Ok/Some,则返回Ok/Some的值,如果是Err/None,则直接调用panic!
2、expect是当得到None而panic时,加一段自定义的信息方便定位。
unwrap它有4个变种能灵活调整代码:
unwrap_or(self, default: T):如果是Ok/Some,则返回Ok/Some的值,如果是Err/None返回给定的default
unwrap_or_default(self) :如果是Ok/Some,则返回Ok/Some的值,如果是Err/None返回Ok/Some相应类型的默认值
unwrap_or_else<F>(self, f: F) :传入一个闭包,如果是Ok/Some,则返回Ok/Some的值,如果是Err/None则执行这个闭包。
unwrap_unchecked(self):不检查返回,报错不执行panic,直接扔给操作系统。