如何反转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
相关产品推荐
相关产品推荐

