如何基于Ok值以惯用方式将Result类型转换为另一种Result类型?
Rust惯用方式:合并Result错误处理与Ok值转换
你可以通过链式调用Result的方法把错误转换和基于Ok值的结果判断合并起来,这是Rust里处理这类转换的惯用写法。
针对你的示例,优化后的代码如下:
fn get_res1() -> Result<bool, ()> { Ok(true) } fn get_res2() -> Result<(), String> { get_res1() // 转换原错误类型为目标错误类型 .map_err(|_| String::from("Execution failed")) // 基于Ok值生成新的Result .and_then(|success| { // 利用bool的then_some生成Option,再转成Result success.then_some(()).ok_or_else(|| String::from("Operation failed")) }) }
逻辑拆解:
map_err(|_| ...):把原Result的Err(())直接转换成目标错误String,和你原来的错误处理逻辑一致。and_then(...):接收原Result的Ok值(这里是bool类型的success),返回一个新的Result:- 当
success为true时,then_some(())生成Some(()),ok_or_else把它转成Ok(()); - 当
success为false时,then_some(())生成None,ok_or_else把它转成指定的Err(String)。
- 当
如果觉得then_some+ok_or_else不够直观,也可以用更直白的if-else写法,效果完全一致:
fn get_res2() -> Result<(), String> { get_res1() .map_err(|_| String::from("Execution failed")) .and_then(|success| { if success { Ok(()) } else { Err(String::from("Operation failed")) } }) }
这种链式写法不需要提前取出Ok值,把所有逻辑串联在一起,更符合Rust的函数式编程风格,也是社区里处理这类Result转换的惯用方式。
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

