首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定义fmt::Display和fmt::Debug

定义fmt::Display和fmt::Debug
EN

Stack Overflow用户
提问于 2021-11-14 15:12:45
回答 1查看 791关注 0票数 1

是否可以同时定义fmt::Displayfmt::Debug,即它们使用相同的实现?

假设我们有以下示例代码(纯粹是为了演示目的):

代码语言:javascript
复制
use std::fmt;

struct MyDate {
    pub year: u16,
    pub month: u8,
    pub day: u8
}

impl PartialEq for MyDate {
    fn eq(&self, other: &Self) -> bool {
        self.year == other.year && self.month == other.month && self.day == other.day
    }
}

impl fmt::Display for MyDate {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{}-{:02}-{:02}", self.year, self.month, self.day)
    }
}

impl fmt::Debug for MyDate {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{}", self)
    }
}

fn main() {
    let d1 = MyDate { year: 2008, month: 9, day: 10 };
    let d2 = MyDate { year: 2008, month: 9, day: 10 };

    println!("Date = {}", d1);  // requires fmt::Display
    assert_eq!(d1, d2);         // requires fmt::Debug
}

为了使用println打印类并使用assert_eq编写单元测试,我需要定义两个fmt特征。有没有一种同时定义fmt::Displayfmt::Debug的“打印”实现的方法?例如,类似于impl fmt::Debug, fmt::Display for MyDate { ... }或类似的东西?

或者仅仅将#[derive(Debug)]放在任何类的前面是一种常见的做法吗?如果我的问题是天真的,因为我是生锈的新手,我很抱歉。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-14 17:08:04

在大多数情况下,DisplayDebug有不同的输出。如果在这两种情况下使用相同的格式是有意义的,那么您编写的代码就可以了。这对#[derive(Debug)]来说也很好--这是你的决定。我认为重要的是要记住的是,Debug不应该遗漏任何东西,而且要明确无误。

在显示的情况下,Display格式完全准确地显示了所有结构的字段,因此重用Display来实现Debug是非常好的。如果您有很多这样的类型,您可以使用一个简单的宏来生成转发到DebugDisplay实现。

顺便提一下,我建议使用#[derive(PartialEq)],而不是您展示的手动PartialEq实现。它完全等价,避免了忘记比较新增加的字段的危险失效模式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69964338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档