是否可以转换Option <result <t,e =“”>&gt;到结果<option <t>,E&gt;没有使用匹配?

时间:2017-04-02 08:45:11

标签: rust optional rust-result

我的第一个想法是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
    })
}

2 个答案:

答案 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());
}