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

为何未派生Debug trait的Rust结构体无法执行assert_eq!宏?

Rust中assert_eq!要求Debug trait的原因及替代方案

先看这段测试代码:

#[derive(PartialEq, Eq)]
struct Anything {
    value: u32,
}

impl Anything {
    pub fn new() -> Self {
        Anything { value: 42 }
    }
}

#[test]
fn test_assert_eq_on_custom_struct() {
    assert_eq!(Anything::new(), Anything::new()); // error[E0277]: `Anything` doesn't implement `Debug`

    assert!(Anything::new() == Anything::new()); // 完全正常 🤔
}

为什么会报错?

查看assert_eq!的实现可以发现,它内部会调用panicking::assert_failed函数——当断言失败时,这个函数需要打印出预期值和实际值的详细信息来辅助调试,因此要求传入的左右参数必须实现Debug trait。

而assert!(a == b)只是单纯检查表达式的布尔结果,失败时不会输出具体的左右值内容,所以只需要结构体实现PartialEq就足够运行。

这种情况正常吗?该用哪种方式?

这是完全正常的设计:assert_eq!的核心价值不仅是验证相等性,更在于失败时提供直观的调试信息。如果你的测试需要在断言失败时快速看到预期和实际的具体值,给结构体派生Debug(比如#[derive(PartialEq, Eq, Debug)])是更优的选择,既保留assert_eq!的便捷性,又能获得更好的调试体验。

如果你的测试只需要验证相等性,不需要失败时的详细值展示,改用assert!(a == b)完全没问题,它的门槛更低,不需要额外实现Debug。

内容的提问来源于stack exchange,提问作者Romain Vincent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:20:01