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

Is it idiomatic Rust to accept a Result<T, E> as a function argument?

考虑以下代码:

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 的通用库中。

Resulta 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();
}

我不能说我见过这样的情况,它很有意义,但如果没有更清楚的解释为什么你会这样做,很难提供更多帮助。

本质上,barErr() 输入有任何用处,还是只是直接传递?在前一种情况下,是的,bar 采取 Result 可能是有意义的——尽管你问的问题看起来不太可能

但是,如果 bar 以类似于

的方式开头
fn bar(x: Result<i32, Error>) -> Result<i32, Error> {
    let y = x?;
    // work with an actual `i32` and potentially output an error as well

也就是说它对 Err 没有实际用途,那么不,它不是惯用的,输入是不必要且无用的复杂。

在这种情况下,您需要的是:

fn bar(x: i32) -> Result<i32, Error> {
    //...
}

fn main() {
    let y = foo(2).and_then(bar).unwrap();
}