You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何反转Rust中的嵌套Result错误类型?

反转嵌套的Rust Result错误类型

你有一个嵌套的Result类型 Result<Result<(), OuterError>, InnerError>,想要将其转换为 Result<Result<(), InnerError>, OuterError>,可以通过模式匹配或Result组合子实现:

方法一:模式匹配(直观易懂)

直接通过match语句处理每个分支逻辑:

let a1: Result<Result<(), OuterError>, InnerError> = func();
let a2: Result<Result<(), InnerError>, OuterError> = match a1 {
    // 两层都成功,直接映射为目标类型的嵌套成功值
    Ok(Ok(())) => Ok(Ok(())),
    // 内层失败,将OuterError转为外层Result的错误
    Ok(Err(outer_err)) => Err(outer_err),
    // 外层失败,将InnerError转为内层Result的错误
    Err(inner_err) => Ok(Err(inner_err)),
};

方法二:Result组合子(简洁写法)

利用Result自带的组合子简化代码,逻辑和模式匹配一致:

let a2 = match a1 {
    // 把内层Result的错误转为外层Result的错误
    Ok(inner_res) => inner_res.map_err(Err),
    // 把外层错误转为内层Result的错误
    Err(inner_err) => Ok(Err(inner_err)),
};

通用工具函数

如果需要多次复用这种转换逻辑,可以封装一个通用函数:

fn reverse_nested_result<T, E1, E2>(res: Result<Result<T, E2>, E1>) -> Result<Result<T, E1>, E2> {
    match res {
        Ok(inner) => inner.map_err(Err),
        Err(e1) => Ok(Err(e1)),
    }
}

// 调用示例
let a2 = reverse_nested_result(a1);

内容的提问来源于stack exchange,提问作者Rol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 23:45:09