在rust编程中,经常在代码中会写.unwrap(),最开始只是抄代码,对这块的设计并不了解,最近代码写的比较多,开始对这一块有了新的理解。
一般来说,当我拥有一个Result对象的时候,他会有两种可能的结果,一个是正常的返回值,另一个是异常情况,就像他的定义一样:Result<T,E>,其中T表示正常的返回值,E表示程序异常时候的异常信息,一般我们用Ok()和Err()来创建Result对象的值。而unwrap()就是对于Result对象进行解包,获取里面的T值,但是如果在unwrap时,Result是Error值,那么就会触发panic。
let result:Result<i32,String> = Ok(123);
let value = result.unwrap();
let result :Result<i32,String> = Err("Error".to_string());
let value = result.unwrap();
在上述代码中,第一个result被unwrap后的值是123,但是第二个unwrap的时候就会触发panic,显示Error信息。
在rust中Option类型也经常用到unwrap,这个类型表示一个可能为空的值,一般我们用Ok()或者None来表示它的值。如果它有值,那么在unwrap的时候就会正常返回它所表示的值,如果它不存在值,在unwrap的时候也会触发一个panic。
let opt:Option<i32> = Some(123);
let value = result.unwrap();
let opt :Option<i32> = None;
let value = result.unwrap();
在上述代码中,第一个opt可以被正常unwrap(),得到结果,但是第二个opt在unwrap的时候就会触发panic,因为它是一个空值。
在实际项目开发中,盲目使用unwrap可能会导致程序运行中出现多个panic,所以推荐使用unwrap_or来返回一个默认值,或者unwrap_or_else来返回一个闭包的结果
let opt = Option<i32> = None;
let val = opt.unwrap_or(111);
let opt = Option<i32> = None;
let val = opt.unwrap_or_else(|| {
println!("opt 中不存在值!");
123
});
上述代码中第一个opt在unwrap_or的时候,由于opt没有值,所以返回参数中的默认值,如果他有值,就会正常返回。第二个opt在unwrap_or_else的时候发现opt中没有值,就会执行参数中的闭包函数,并且将闭包函数的结果返回赋值给val。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。