我怎样才能简洁地结合许多不同类型的结果?

Syn*_*sso 6 rust

目前我使用这种模式:

let a: Result<A, ParseError> = parseA();
let b: Result<B, ParseError> = parseB();
let c: Result<C, ParseError> = parseC();
a.and_then(|a| b.map(|b| (a, b))).and_then(|(a,b)| c.map(|c| {
  // finally the crux of what I want to do
  a.foo(b).bar(c)
}))
Run Code Online (Sandbox Code Playgroud)

有没有定义一个更简洁的方式a,bc,如Scala的用于表达?

oli*_*obk 6

我通常将所有内容包裹在层中,而不是通过元组链接:

let result = a.and_then(|a| {
    b.and_then(|b| {
        c.map(|c| {
            a.foo(b).bar(c)
        })
    })
});
Run Code Online (Sandbox Code Playgroud)

或者,在最近的 Rust 版本中,您可以精心使用该?运算符:

let result = a.and_then(|a| {
    a.foo(b?).bar(c?)
});
Run Code Online (Sandbox Code Playgroud)

闭包可以让你很好、安全地做到这一点。

Result当然,如果您想将中间值存储在变量中,则这不起作用。

  • 仅当您的函数返回“Result”时。如果您想手动处理它,那就不用了。即使你返回一个 `Result`,你也需要在 `Ok(a?.foo(b?))` 和 `a.and_then(|a| a.foo(b?))` 之间做出决定,这取决于你的真实的代码可能会使后者更具可读性(在 serde 中我们经常遇到这种情况)。 (2认同)