Result::and_then()
非常适合编写控制流程。
fn some_fn() -> Result<String, Error> {
Ok("Yay".to_string())
}
some_fn()
.and_then(|value| some_other_fn())
.and_then(|some_other_value| /* ... */)
有时我们想要创建副作用并仍然传播发射的值。假设我们想在收到价值时打印价值:
some_fn()
.and_then(|value| {
println!("{}", &value);
some_other_fn()
})
.and_then(|some_other_value| /* ... */)
有一个更好的方法吗?像Reactive Extensions' tap()
operator这样的东西会很棒。
当你想要改变价值时,map
和and_then
是合适的。使用match
或if let
适用于副作用:
let r = some_fn();
if let Ok(v) = &r {
println!("{}", v);
}
r.and_then(|_| some_other_fn())
也可以看看:
假设你只关心Result
是Ok
的副作用...
您还可以创建扩展特征以将所需方法添加到Result
。我主张称它为inspect
,因为它是the parallel method on 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
}
}
some_fn()
.inspect(|v| println!("{}", v))
.and_then(|_| some_fn())
也可以看看: