是否可以将Option <Result <T,E >>转换为Result <Option <T>,E>而不使用匹配?

Gre*_*mer 8 optional rust rust-result

我首先想到的是mapOption的,但我不能用try!从封闭的内部.该match声明看起来是不必要的,但我无法弄清楚如何简化它.

fn example<T, E>(val: Option<Result<T, E>>) -> Result<Option<T>, E> {
    Ok(match val {
        Some(v) => Some(v?),
        None => None
    })
}
Run Code Online (Sandbox Code Playgroud)

Ry-*_*Ry- 7

你可以使用Option::map_or():

val.map_or(Ok(None), |v| v.map(Some))
Run Code Online (Sandbox Code Playgroud)

  • 反过来可以通过`val.map(| v | v.map(Ok))来完成.unwrap_or_else(| e | Some(Err(e)))` (4认同)

Sta*_*eur 5

在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());
}
Run Code Online (Sandbox Code Playgroud)