我的第一个想法是map
Option
,但我无法从关闭内部使用try!
。 match
语句看起来没必要,但我无法弄清楚如何简化它。
fn example<T, E>(val: Option<Result<T, E>>) -> Result<Option<T>, E> {
Ok(match val {
Some(v) => Some(v?),
None => None
})
}
答案 0 :(得分:7)
您可以使用Option::map_or()
:
val.map_or(Ok(None), |v| v.map(Some))
答案 1 :(得分:4)
在Rust 1.33中,transpose()
是稳定的,因此您可以将其命名为:
fn main() {
let x: Result<Option<i32>, ()> = Ok(Some(5));
let y: Option<Result<i32, ()>> = Some(Ok(5));
assert_eq!(x, y.transpose());
}