|
|
@ -1,4 +1,4 @@
|
|
|
|
## 附录 D:派生特征 derive
|
|
|
|
## 附录 D:可派生的 trait
|
|
|
|
|
|
|
|
|
|
|
|
在本书的各个部分中,我们讨论了可应用于结构体和枚举定义的 `derive` 属性。被 `derive` 标记的对象会自动实现对应的默认特征代码,继承相应的功能。
|
|
|
|
在本书的各个部分中,我们讨论了可应用于结构体和枚举定义的 `derive` 属性。被 `derive` 标记的对象会自动实现对应的默认特征代码,继承相应的功能。
|
|
|
|
|
|
|
|
|
|
|
@ -18,7 +18,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
本附录所提供的可派生特征列表其实并不全面:库可以为其内部的特征实现 `derive` ,因此除了本文列出的标准库 `derive` 之外,还有很多很多其它库的 `derive` 。实现 `derive` 涉及到过程宏的应用,这在[宏章节](../advance/macro.md)中有介绍。
|
|
|
|
本附录所提供的可派生特征列表其实并不全面:库可以为其内部的特征实现 `derive` ,因此除了本文列出的标准库 `derive` 之外,还有很多很多其它库的 `derive` 。实现 `derive` 涉及到过程宏的应用,这在[宏章节](../advance/macro.md)中有介绍。
|
|
|
|
|
|
|
|
|
|
|
|
### 用于程序员Debug输出的 `Debug`
|
|
|
|
### 用于开发者输出的 `Debug`
|
|
|
|
|
|
|
|
|
|
|
|
`Debug` 特征可以让指定对象输出调试格式的字符串,通过在 `{}` 占位符中增加 `:?` 表明,例如`println!("show you some debug info: {:?}", MyObject);`.
|
|
|
|
`Debug` 特征可以让指定对象输出调试格式的字符串,通过在 `{}` 占位符中增加 `:?` 表明,例如`println!("show you some debug info: {:?}", MyObject);`.
|
|
|
|
|
|
|
|
|
|
|
@ -26,7 +26,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
例如,在使用 `assert_eq!` 宏时, `Debug` 特征是必须的。如果断言失败,这个宏就把给定实例的值打印出来,这样程序员就能看到两个实例为什么不相等。
|
|
|
|
例如,在使用 `assert_eq!` 宏时, `Debug` 特征是必须的。如果断言失败,这个宏就把给定实例的值打印出来,这样程序员就能看到两个实例为什么不相等。
|
|
|
|
|
|
|
|
|
|
|
|
### 相等比较的 `PartialEq` 和 `Eq`
|
|
|
|
### 等值比较的 `PartialEq` 和 `Eq`
|
|
|
|
|
|
|
|
|
|
|
|
`PartialEq` 特征可以比较一个类型的实例以检查是否相等,并开启了 `==` 和 `!=` 运算符的功能。
|
|
|
|
`PartialEq` 特征可以比较一个类型的实例以检查是否相等,并开启了 `==` 和 `!=` 运算符的功能。
|
|
|
|
|
|
|
|
|
|
|
@ -38,7 +38,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
例如,对于一个 `HashMap<K, V>` 中的 key 来说, `Eq` 是必须的,这样 `HashMap<K, V>` 就可以知道两个 key 是否一样。
|
|
|
|
例如,对于一个 `HashMap<K, V>` 中的 key 来说, `Eq` 是必须的,这样 `HashMap<K, V>` 就可以知道两个 key 是否一样。
|
|
|
|
|
|
|
|
|
|
|
|
### `PartialOrd` 和 `Ord` 用于次序比较
|
|
|
|
### 次序比较的 `PartialOrd` 和 `Ord`
|
|
|
|
|
|
|
|
|
|
|
|
`PartialOrd` 特征可以让一个类型的多个实例实现排序功能。实现了 `PartialOrd` 的类型可以使用 `<`、 `>`、`<=` 和 `>=` 操作符。一个类型想要实现 `PartialOrd` 的前提是该类型已经实现了 `PartialEq` 。
|
|
|
|
`PartialOrd` 特征可以让一个类型的多个实例实现排序功能。实现了 `PartialOrd` 的类型可以使用 `<`、 `>`、`<=` 和 `>=` 操作符。一个类型想要实现 `PartialOrd` 的前提是该类型已经实现了 `PartialEq` 。
|
|
|
|
|
|
|
|
|
|
|
@ -52,7 +52,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
例如,当在 `BTreeSet<T>`(一种基于有序值存储数据的数据结构)上存值时, `Ord` 是必须的。
|
|
|
|
例如,当在 `BTreeSet<T>`(一种基于有序值存储数据的数据结构)上存值时, `Ord` 是必须的。
|
|
|
|
|
|
|
|
|
|
|
|
### `Clone` 和 `Copy` 用于值复制
|
|
|
|
### 复制值的 `Clone` 和 `Copy`
|
|
|
|
|
|
|
|
|
|
|
|
`Clone` 特征用于创建一个值的深拷贝(deep copy),复制过程可能包含代码的执行以及堆上数据的复制。查阅 [“通过Clone来进行深拷贝”](../core/ownership.md#通过Clone来进行深拷贝)获取有关 `Clone` 的更多信息。
|
|
|
|
`Clone` 特征用于创建一个值的深拷贝(deep copy),复制过程可能包含代码的执行以及堆上数据的复制。查阅 [“通过Clone来进行深拷贝”](../core/ownership.md#通过Clone来进行深拷贝)获取有关 `Clone` 的更多信息。
|
|
|
|
|
|
|
|
|
|
|
@ -68,13 +68,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
总之, `Copy` 拥有更好的性能,当浅拷贝足够的时候,就不要使用 `Clone` ,不然会导致你的代码运行更慢,对于[性能优化](../performance/intro.md)来说,一个很大的方面就是减少热点路径深拷贝的发生。
|
|
|
|
总之, `Copy` 拥有更好的性能,当浅拷贝足够的时候,就不要使用 `Clone` ,不然会导致你的代码运行更慢,对于[性能优化](../performance/intro.md)来说,一个很大的方面就是减少热点路径深拷贝的发生。
|
|
|
|
|
|
|
|
|
|
|
|
### `Hash` 用于实现值映射内存存储
|
|
|
|
### 固定大小的值映射的 `Hash`
|
|
|
|
|
|
|
|
|
|
|
|
`Hash` 特征允许你使用 `hash` 函数把一个任意大小的实例映射到一个固定大小的值上。派生 `Hash` 实现了 `hash` 方法,对某个类型进行 `hash` 调用,其实就是对该类型下每个字段单独进行 `hash` 调用,然后把结果进行汇总,这意味着该类型下的所有的字段也必须实现了 `Hash`,这样才能够派生 `Hash`。
|
|
|
|
`Hash` 特征允许你使用 `hash` 函数把一个任意大小的实例映射到一个固定大小的值上。派生 `Hash` 实现了 `hash` 方法,对某个类型进行 `hash` 调用,其实就是对该类型下每个字段单独进行 `hash` 调用,然后把结果进行汇总,这意味着该类型下的所有的字段也必须实现了 `Hash`,这样才能够派生 `Hash`。
|
|
|
|
|
|
|
|
|
|
|
|
例如,在 `HashMap<K, V>` 上存储数据,存放 key 的时候, `Hash` 是必须的。
|
|
|
|
例如,在 `HashMap<K, V>` 上存储数据,存放 key 的时候, `Hash` 是必须的。
|
|
|
|
|
|
|
|
|
|
|
|
### `Default` 用于获取默认值
|
|
|
|
### 默认值的 `Default`
|
|
|
|
|
|
|
|
|
|
|
|
`Default` 特征会帮你创建一个类型的默认值。 派生 `Default` 意味着自动实现了 `default` 函数。 `default` 函数的派生实现调用了类型每部分的 `default` 函数,这意味着类型中所有的字段也必须实现了 `Default`,这样才能够派生 `Default` 。
|
|
|
|
`Default` 特征会帮你创建一个类型的默认值。 派生 `Default` 意味着自动实现了 `default` 函数。 `default` 函数的派生实现调用了类型每部分的 `default` 函数,这意味着类型中所有的字段也必须实现了 `Default`,这样才能够派生 `Default` 。
|
|
|
|
|
|
|
|
|
|
|
|