Result::and_then()对于编写控制流非常有用。
fn some_fn() -> Result<String, Error> {
Ok("Yay".to_string())
}
Run Code Online (Sandbox Code Playgroud)
some_fn()
.and_then(|value| some_other_fn())
.and_then(|some_other_value| /* ... */)
Run Code Online (Sandbox Code Playgroud)
有时我们想要产生副作用并仍然传播发出的值。假设我们想在收到值时打印它:
some_fn()
.and_then(|value| {
println!("{}", &value);
some_other_fn()
})
.and_then(|some_other_value| /* ... */)
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?像Reactive Extensions 的tap()操作符这样的东西会很棒。
map和and_then适合当您想要转换值时。使用matchorif let适合治疗副作用:
let r = some_fn();
if let Ok(v) = &r {
println!("{}", v);
}
r.and_then(|_| some_other_fn())
Run Code Online (Sandbox Code Playgroud)
也可以看看:
假设Result您只关心副作用Ok...
您还可以创建一个扩展特征以将所需的方法添加到Result. 我主张inspect这样称呼它,因为这是Iterator.
trait InspectExt<T> {
fn inspect<F>(self, f: F) -> Self
where
F: FnOnce(&T);
}
impl<T, E> InspectExt<T> for Result<T, E> {
fn inspect<F>(self, f: F) -> Self
where
F: FnOnce(&T),
{
if let Ok(v) = &self {
f(v)
}
self
}
}
Run Code Online (Sandbox Code Playgroud)
some_fn()
.inspect(|v| println!("{}", v))
.and_then(|_| some_fn())
Run Code Online (Sandbox Code Playgroud)
也可以看看:
| 归档时间: |
|
| 查看次数: |
1485 次 |
| 最近记录: |