接受 Result<T, E> 作为函数参数是 Rust 惯用的吗?

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直接传递之前处理错误或解开结果。

Pet*_*all 6

接受 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)