【发布时间】:2020-04-19 08:37:13
【问题描述】:
我是 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
}
我观察到的唯一区别是预期中有一条自定义的恐慌消息。
这两个是可以互换的,还是有什么特殊的场景我们应该使用一个而不是另一个?
【问题讨论】:
-
据我所知,它们是可以互换的。我通常使用
unwrap,如果逻辑100% 清楚不会发生故障,如果有可能出现我没有考虑过的边缘情况——或者可能触发的情况,我会使用expect通过不正确的开发人员编写的配置文件等。 -
此answer 很好地概述了在选择一种或另一种时要考虑的错误模式。简而言之,
unwrap()是一种在可恢复错误和不可恢复错误之间进行转换的方法。另一方面,当您调用expect()时,您假设已经处于不可恢复的错误状态。我想指导原则应该是:如果您无法从失败的unwrap()调用中恢复,请选择expect()并让您的诊断包含更好的错误消息。 -
@IInspectable:我认为您误读了您链接的答案。
unwrap和expect都从可恢复转换为不可恢复,唯一的区别是一个指定自定义错误消息,另一个不指定。 -
@mat:我想我误解了我的观点。
unwrap()和expect()都将panic!(),当没有什么可以打开时。在这方面,它们是相同的。这是您的代码所处的情况,这会有所不同。如果没有展开的值,您的代码无法有意义地继续,请选择expect()。如果您可以回应没有值,请在验证值存在后选择unwrap()。在这种情况下,unwrap()只会在您的代码出现问题时panic!()才会从可恢复状态转变为不可恢复状态。 -
这两个选项都引入了一个函数。唯一的区别在于他们的名字。这并没有改变假设需要
unwrap()和其他东西的事实。其他东西被命名为expect()。特定的名称不如不同的属性重要。这使您可以向代码的读者传达不同的语义。
标签: rust