考虑以下代码:
fn foo(x: i32) -> Result<i32, Error> {
//...
}
fn bar(x: Result<i32,Error>) -> Result<i32, Error> {
//...
}
fn main() {
let y = bar(foo(2)).unwrap();
}
传递 Result
类型是惯用的吗?或者您应该在直接传递 i32
之前处理错误或解包 bar()
的结果。
最佳答案
接受 Result
作为参数是很不寻常的,除了在处理 Result
的通用库中。
Result
有 a lot of methods这有助于使其更符合人体工程学。例如,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();
}
关于error-handling - 接受 Result<T, E> 作为函数参数是惯用的 Rust 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62445889/