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

如何传递闭包在Result的Ok变体返回值前执行

Rust 链式处理 Result 的 Ok/Err 变体

你想要的链式处理可以通过 Result 提供的 map 和 map_err 方法组合实现,不用拆分步骤:

  • map 专门处理 Ok 变体:接收闭包,对 Ok 包裹的值执行操作后返回新的 Ok 结果
  • map_err 专门处理 Err 变体:接收闭包,对 Err 包裹的错误执行操作后返回新的 Err 结果

修改你的 foo2 函数,用链式调用实现需求:

fn foo1() -> Result<i32, String> {
    Err("error".to_string())
}

fn foo2() -> Result<String, bool> {
    foo1()
        // 处理 Ok 变体:先执行自定义逻辑,再返回转换后的值
        .map(|res| {
            println!("foo1 succeeded with value: {}", res);
            res.to_string()
        })
        // 处理 Err 变体:先执行自定义逻辑,再转换错误类型并向上传递
        .map_err(|err| {
            println!("foo1 failed {}", err);
            false
        })
}

fn main() {
    let _ = foo2();
}

如果你的 Ok 处理逻辑需要返回另一个 Result(比如可能产生新错误),可以用 and_then 替代 map,它的闭包返回 Result 类型,会自动展开嵌套:

fn process_ok_value(res: i32) -> Result<String, bool> {
    if res > 0 {
        Ok(res.to_string())
    } else {
        Err(true)
    }
}

fn foo2() -> Result<String, bool> {
    foo1()
        .and_then(|res| {
            println!("processing ok value: {}", res);
            process_ok_value(res)
        })
        .map_err(|err| {
            println!("foo1 failed {}", err);
            false
        })
}

这种链式写法既符合 Rust 的惯用风格,也能清晰地分别处理两种变体的逻辑,避免额外的变量绑定和分支判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 07:27:20