tom*_*mus 2 error-handling idioms rust
考虑以下代码:
fn foo(x: i32) -> Result<i32, Error> {
//...
}
fn bar(x: Result<i32,Error>) -> Result<i32, Error> {
//...
}
fn main() {
let y = bar(foo(2)).unwrap();
}
Run Code Online (Sandbox Code Playgroud)
这是惯用的,传递Result类型吗?或者你应该bar()在i32直接传递之前处理错误或解开结果。
接受 aResult作为参数是很不寻常的,除了在处理Results 的通用库中。
Result有很多方法可以帮助使其更符合人体工程学。例如,and_then将函数调用链接到先前的结果。您的示例可以更改为:
fn foo(x: i32) -> Result<i32, Error> {
//...
}
fn bar(x: i32) -> Result<i32, Error> {
//...
}
fn main() {
let y = foo(2).and_then(|value| bar(value)).unwrap();
// or more concisely in this simple case:
let y = foo(2).and_then(bar).unwrap();
}
Run Code Online (Sandbox Code Playgroud)