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
, поскольку это имя параллельного метода для 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())
См. Также: