是否可以转换选项 >结果 ,E>没有使用匹配?

问题描述 投票:8回答:2

我的第一个想法是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
    })
}
rust optional rust-result
2个回答
7
投票

你可以使用Option::map_or()

val.map_or(Ok(None), |v| v.map(Some))

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());
}
© www.soinside.com 2019 - 2024. All rights reserved.