接受 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
的通用库中。
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();
}
我不能说我见过这样的情况,它很有意义,但如果没有更清楚的解释为什么你会这样做,很难提供更多帮助。
本质上,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();
}
考虑以下代码:
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();
}
我不能说我见过这样的情况,它很有意义,但如果没有更清楚的解释为什么你会这样做,很难提供更多帮助。
本质上,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();
}