如何传递闭包在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
相关产品推荐
相关产品推荐

