使用 .unwrap() 应该被视为不好的做法吗?

at5*_*321 2 error-handling rust

看到这个问题下的评论,让我想知道 - 使用是否应该unwrap()被视为不好的做法?

在我看来,有时打开包装是有意义的。至少在这两种情况下:

  1. 我们知道一个Option值不能是None,因为我们已经在代码的前面处理过这种情况。一个例子:
if o.is_none() {
    // do some stuff here...
    return ...;
}
// ...
o.unwrap()   //  <--- Here I do NOT expect a None
Run Code Online (Sandbox Code Playgroud)
  1. 如果我们开发一个简单的短期工具,无论哪种方式都会以错误结束,依靠恐慌而不是“适当的”错误处理(使用Result?等)可以或多或少地简化代码。

显然,有时依赖unwrap()可能弊大于利,所以我是否应该始终避免使用对我来说并不是很明显unwrap()?如果没有的话什么时候可以使用unwrap()

Mas*_*inn 5

我们知道 Option 值不能为 None,因为我们已经在代码的前面检查了这种情况。一个例子:

if o.is_none() {
    return ...;
}
// ...
o.unwrap()   //  <--- Here I do NOT expect a None
Run Code Online (Sandbox Code Playgroud)

虽然在某些情况下这是不可避免的,但处理此问题的“正确”方法是使用模式匹配,例如

let o = if let Some(o) = o {
    o
} else {
    return o;
}
Run Code Online (Sandbox Code Playgroud)

或类似的规定。

在某些情况下,“展开”是不必要的,但在这种情况下,在生产软件中,我将使用expect非通用解释,或明确的panic!假设文档。

如果我们开发一个简单的短期工具,无论哪种方式都会以错误结束,依靠恐慌而不是“正确的”错误处理(使用 Result、?等)可以或多或少地简化代码。

这不会使它成为“良好实践”,而只会使其成为“我不关心在这种情况下的不良实践”。

这是一个完全合理的立场,但这不是好的做法。