我是 Rust 的新手,正试图理解何时应该使用 unwrap 和 expect。
以下是一段示例代码:
use std::env;
fn main() {
let args: Vec<String> = env::args().collect();
let query = args.get(1).unwrap();
println!("query from unwrawp: {}", query);
let query = args.get(1).expect("insufficient arguments");
println!("query from expect: {}", query);
//$ cargo run hello
//OUTPUT:
//query from expect: hello
//query from unwrawp: hello
}
我观察到的唯一区别是expect中有一个自定义的panic消息。
这两者是否可以互换或者有任何特殊情况需要使用其中一个而不是另一个?
unwrap()
或expect()
时考虑错误模式。简而言之,unwrap()
是在可恢复错误和不可恢复错误之间转换的一种方式。相反地,在调用expect()
时,你假设已经处于不可恢复的错误状态。我想指导原则应该是:如果你无法从unwrap()
调用失败中恢复,请选择expect()
并包含更好的错误信息。 - IInspectableunwrap
和expect
都将可恢复的转换为不可恢复的,唯一的区别在于一个指定了自定义错误消息,而另一个没有。 - Matthieu M.unwrap()
和expect()
都会导致panic!()
。在这方面,它们是相同的。而你的代码所处的情况则是有所不同的。如果你的代码不能在没有unwrap值的情况下继续运行,那么选择expect()
。如果你可以响应没有值的情况,请选择unwrap()
,但要先验证该值是否存在。在这种情况下,只有当你的代码出现问题从而从可恢复状态转换为不可恢复状态时,unwrap()
才会导致panic!()
。 - IInspectableunwrap()
和其他内容需要的假设。那个其他内容被命名为expect()
。具体名称并不重要,重要的是具有不同的属性。这使您可以向代码读者传达不同的语义。 - IInspectable