在您的示例中,您不仅想要继续、跳出或返回常规值,而是返回一个错误。对于这种特殊情况,Aiden4的答案是正确的选择。或者,如果您正在使用 anyhow,您应该查看 this。
但我曾经遇到过这样的情况,我想要取消包装或(在 None
的情况下)直接 continue
、break
或 return
非错误值。
更新(Rust 1.65+)
let-else
let-else 功能已在 Rust 1.65 中稳定。以下是如何使用它的示例:
let options = vec![Some(74), None, Some(9)];
for o in options {
let Some(v) = o else { continue };
println!("v = {v}");
}
旧的答案(和备选方案)
Rust(仍然)没有提供一种简短而明确地完成这件事的方法。
这里有一个“一行代码”的方法,可以实现该功能,但是仍然有点冗长:
let v = if let Some(d) = some_option_value { d } else { continue; };
如果您想要一个更短的解决方案,这里有两个选项...
宏
您可以编写如下的宏:
macro_rules! unwrap_or {
($e:expr, $or_do_what:expr) => {
if let Some(d) = $e { d } else { $or_do_what }
};
}
这将允许您编写如下代码:
let options = vec![Some(74), None, Some(9)];
for o in options {
let v = unwrap_or!(o, continue);
}
这只是一个琐碎的例子,但我认为最大的好处在于当您需要执行多个检查时,可以避免编写类似于这样的“惯用语”:
for thing in things {
if let Some(a) = thing {
if let Some(b) = a.another_opt {
if let Some(c) = a.yet_another_opt {
}
}
}
}
您可以通过避免嵌套多个代码块来简化代码,例如:
for thing in things {
let a = unwrap_or!(thing, continue);
let b = unwrap_or!(a.another_opt, continue);
let c = unwrap_or!(a.yet_another_opt, continue);
}
这是否是一个好的实践,当然是主观的。
let...else(不稳定)
有一个不稳定的let...else
功能,旨在解决这个问题。例如:
#![feature(let_else)]
...
let options = vec![Some(74), None, Some(9)];
for o in options {
let Some(v) = o else { continue };
println!("v = {v}");
}
?
运算符。 - Charles DuffyResult
,那么这并不能解决问题。我更新了我的问题以使这更加明显。 - marcantonio