繁体   English   中英

接受结果是惯用的 Rust<t, e> 作为 function 参数?</t,>

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

Result很多方法可以帮助使用它更符合人体工程学。 例如, and_then将 function 调用链接到先前的结果。 您的示例可以更改为:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM