Rust 是否可以转换选项<;结果<;T、 E>&燃气轮机;结果<;选项<;T>;,E>;不使用火柴?

Rust 是否可以转换选项<;结果<;T、 E>&燃气轮机;结果<;选项<;T>;,E>;不使用火柴?,rust,optional,rust-result,Rust,Optional,Rust Result,我的第一个想法是映射选项,但我不能使用试试从闭包内部。match语句看起来没有必要,但我不知道如何简化它 fn example<T, E>(val: Option<Result<T, E>>) -> Result<Option<T>, E> { Ok(match val { Some(v) => Some(v?), None => None }) } fn示例(val:

我的第一个想法是映射
选项
,但我不能使用
试试从闭包内部。
match
语句看起来没有必要,但我不知道如何简化它

fn example<T, E>(val: Option<Result<T, E>>) -> Result<Option<T>, E> {
    Ok(match val {
        Some(v) => Some(v?),
        None => None
    })
}
fn示例(val:Option)->结果{
Ok(匹配val{
一些(v)=>一些(v?),
无=>无
})
}
您可以使用:

在Rust 1.33中,是稳定的,因此您可以将其称为:

fn main() {
    let x: Result<Option<i32>, ()> = Ok(Some(5));
    let y: Option<Result<i32, ()>> = Some(Ok(5));
    assert_eq!(x, y.transpose());
}
fn main(){
设x:Result=Ok(一些(5));
设y:Option=Some(Ok(5));
断言(x,y.转置());
}

可以通过
val.map(|v | v.map(Ok)).展开|或|其他(| e | Some(Err(e)))完成相反的操作。
fn main() {
    let x: Result<Option<i32>, ()> = Ok(Some(5));
    let y: Option<Result<i32, ()>> = Some(Ok(5));
    assert_eq!(x, y.transpose());
}