我们讨论了可应用于结构体和枚举定义的 derive 属性。derive 属性会在使用

derive 语法标记的类型上生成对应 trait 的默认实现的代码。

在本附录中提供了标准库中所有可以使用 derive 的 trait 的参考。这些部分涉及到:

• 该 trait 将会派生什么样的操作符和方法

• 由 derive 提供什么样的 trait 实现

• 由什么来实现类型的 trait

• 是否允许实现该 trait 的条件

• 需要 trait 操作的例子

如果你希望不同于 derive 属性所提供的行为,请查阅 标准库文档 中每个 trait 的细节以了解如何手动实

现它们。

标准库中定义的其它 trait 不能通过 derive 在类型上实现。这些 trait 不存在有意义的默认行为,所以由

你负责以合理的方式实现它们。

一个无法被派生的 trait 的例子是为终端用户处理格式化的 Display 。你应该时常考虑使用合适的方

法来为终端用户显示一个类型。终端用户应该看到类型的什么部分?他们会找出相关部分吗?对他们

来说最相关的数据格式是什么样的?Rust 编译器没有这样的洞察力,因此无法为你提供合适的默认行为。

本附录所提供的可派生 trait 列表并不全面:库可以为其自己的 trait 实现 derive,可以使用 derive 的

trait 列表事实上是无限的。实现 derive 涉及到过程宏的应用,这在第十九章的 ” 宏” 有介绍。

用于程序员输出的 Debug

Debug trait 用于开启格式化字符串中的调试格式,其通过在 {} 占位符中增加 :? 表明。

Debug trait 允许以调试目的来打印一个类型的实例,所以使用该类型的程序员可以在程序执行的特定

时间点观察其实例。

例如,在使用 assert_eq! 宏时,Debug trait 是必须的。如果等式断言失败,这个宏就把给定实例的值

作为参数打印出来,如此程序员可以看到两个实例为什么不相等。

等值比较的 PartialEq 和 Eq

PartialEq trait 可以比较一个类型的实例以检查是否相等,并开启了 == 和 != 运算符的功能。

派生的 PartialEq 实现了 eq 方法。当 PartialEq 在结构体上派生时,只有所有的字段都相等时两个实例

才相等,同时只要有任何字段不相等则两个实例就不相等。当在枚举上派生时,每一个成员都和其自身

相等,且和其他成员都不相等。

例如,当使用 assert_eq! 宏时,需要比较比较一个类型的两个实例是否相等,则 PartialEq trait 是必须的。

Eq trait 没有方法。其作用是表明每一个被标记类型的值等于其自身。Eq trait 只能应用于那些实现了

PartialEq 的类型,但并非所有实现了 PartialEq 的类型都可以实现 Eq。浮点类型就是一个例子:浮点数


的实现表明两个非数字(NaN,not-a-number)值是互不相等的。

例如,对于一个 HashMap<K, V> 中的 key 来说,Eq 是必须的,这样 HashMap<K, V> 就可以知道两个

key 是否一样了。