![](/img/trans.png)
[英]What's the idiomatic Rust way to wrap a non-error function with Result?
[英]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();
}
我不能说我见过的情况很有意义,但如果没有更清楚地解释你为什么要这样做,就很难提供更多帮助。
本质上, bar
对Err()
输入有任何用处,还是直接通过它? 在前一种情况下,是的, 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.