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

当Result的Err类型未实现Debug时,替代unwrap()的简洁方案

解决方案

1. 自定义通用函数

写一个可复用的函数,直接处理Result类型,返回Ok值或触发自定义panic:

fn get_ok_or_panic<T, E>(result: Result<T, E>, panic_msg: &str) -> T {
    match result {
        Ok(value) => value,
        Err(_) => panic!("{}", panic_msg),
    }
}

// 使用示例
let x_ok = get_ok_or_panic(x, "Something went horribly wrong!");

2. 为Result实现扩展Trait

通过自定义Trait给Result添加类似expect的方法,调用更符合Rust的链式风格:

trait GetOkOrPanic {
    type OkType;
    fn get_ok_or_panic(self, panic_msg: &str) -> Self::OkType;
}

impl<T, E> GetOkOrPanic for Result<T, E> {
    type OkType = T;
    fn get_ok_or_panic(self, panic_msg: &str) -> T {
        match self {
            Ok(val) => val,
            Err(_) => panic!("{}", panic_msg),
        }
    }
}

// 使用示例
let x_ok = x.get_ok_or_panic("Something went horribly wrong!");

3. 简化的if let写法

如果只是临时使用,不想额外定义函数或Trait,可以用if let简化match代码:

let x_ok = if let Ok(val) = x { val } else { panic!("Something went horribly wrong!") };

这些方案都不需要Err类型实现Debug,因为我们完全忽略了Err变体的具体值,只触发自定义的panic消息,完美适配测试场景中快速获取Ok值的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:32:32