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

时间:2017-01-31 06:21:34

标签: 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)
}))

是否有更简洁的方式来定义ab&amp; c,例如Scala for-expression?

1 个答案:

答案 0 :(得分:3)

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

find -type d -exec ls -td1 {} \; | tail -n +15

或者,在最近的Rust版本中,您可以精心使用let result = a.and_then(|a| { b.and_then(|b| { c.map(|c| { a.foo(b).bar(c) }) }) }); 运算符:

?

Closures允许您安全而安全地完成此操作。

当然,如果要将中间let result = a.and_then(|a| { a.foo(b?).bar(c?) }); 存储在变量中,这不起作用。