我更喜欢使用 let else 语句,因为它消除了代码中的嵌套
let Ok(result) = function_call_that_returns_a_result() else {
return "error message".into();
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用 if let、else 或 match 语句,我就可以访问内部的实际错误消息。
if let Err(err) = function_call_that_returns_a_result() {
return format!("Error: {}", error).into();
}
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法可以避免使用第二种方法?因为如果我这样使用它,我会得到额外的嵌套。
if let Some(value) = function_call_that_returns_a_result() {
// value is available one level nested
}
Run Code Online (Sandbox Code Playgroud)
其他方法也可供考虑。我想避免必须检查相同的可选两次,否则,我只会检查一次,打印错误,然后在保证它不包含错误后 unwrap() 。然而,这种方法感觉很笨拙。
不适用于let- else,但还有另一种可用的构造,即之前使用过的let- else:
let result = match function_call_that_returns_a_result() {
Ok(result) => result,
Err(error) => return format!("Error: {}", error).into(),
};
Run Code Online (Sandbox Code Playgroud)
这样可以避免嵌套,但会导致Ok(result) => result.
在声明的手臂Error中打印w/o :elselet-elsematch
fn main() {
let result = function_call_that_returns_a_result(); // Result
let Ok(ok) = result else {
println!("{}", result.err().unwrap());
return;
};
println!("{ok}");
}
Run Code Online (Sandbox Code Playgroud)