目前我使用这种模式:
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,b和c,如Scala的用于表达?
我通常将所有内容包裹在层中,而不是通过元组链接:
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当然,如果您想将中间值存储在变量中,则这不起作用。