Rust中统一不同Result成功返回类型并传递错误的方法
解决方法
核心思路是把两个不同的成功返回类型统一成同一个类型(比如(),因为你不关心成功结果),同时保留原错误信息。这里用map方法处理返回u64的分支即可:
示例代码
假设外部crate的函数定义如下:
use std::error::Error; // 模拟外部crate的函数 fn return_u64() -> Result<u64, Box<dyn Error>> { Ok(42) } fn return_nothing() -> Result<(), Box<dyn Error>> { Ok(()) }
你的my_fun可以这样实现:
fn my_fun(flag: bool) -> Result<(), Box<dyn Error>> { // 根据布尔值选择调用函数,统一成功返回类型为() if flag { // 用map把Ok(u64)转成Ok(()),Err原样保留 return_u64().map(|_| ())?; } else { return_nothing()?; } Ok(()) }
原理说明
map(|_| ())会将Result<u64, Error>中的成功值u64丢弃,替换成单元类型(),错误部分完全保留,这样两个分支的返回类型就统一为Result<(), Error>了。?运算符会自动将错误向上传递,满足你“失败时传递错误”的需求。- 最终函数返回
Result<(), Error>,编译完全没问题。
也可以写成更简洁的表达式形式:
fn my_fun(flag: bool) -> Result<(), Box<dyn Error>> { (if flag { return_u64().map(|_| ()) } else { return_nothing() })?; Ok(()) }
内容的提问来源于stack exchange,提问作者bretauv
相关产品推荐
相关产品推荐

