From 9ca66c8503e3dc99bd7119eab5a5e2bfa305b8f3 Mon Sep 17 00:00:00 2001 From: Unisko PENG Date: Mon, 10 Apr 2023 17:38:01 +0800 Subject: [PATCH] Update Ch21 --- src/Ch21_Appendix.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/Ch21_Appendix.md b/src/Ch21_Appendix.md index 56b33bb..25cbce4 100644 --- a/src/Ch21_Appendix.md +++ b/src/Ch21_Appendix.md @@ -376,5 +376,28 @@ fn main() { **`Clone` and `Copy` for Duplicating Values** +`Clone` 特质实现了显式创建值的深拷贝,而该复制过程则可能涉及运行一些任意代码,arbitary code,与拷贝内存堆数据。请参阅第 4 章中 [“变量与数据交互方式:克隆”](Ch04_Understanding_Ownership.md#变量与数据交互方式之二克隆) 小节,了解更多有关 `Clone` 的信息。 + +派生 `Clone` 会实现 `clone` 方法,当对整个类型实现了这个方法时,其就会在该类型的各个部分上调用 `clone`。这意味着类型要派生 `Clone` 其中的全部字段或值,都必须同时实现 `Clone`。 + +需要 `Clone` 特质的一个示例,便是在切片上调用 `to_vec` 方法时。切片不持有其包含的那些类型实例,但自 `to_vec` 所返回的那个矢量值,却将需要持有他的那些实例,从而 `to_vec` 会调用各个条目上的 `clone`。因此,存储在切片中的类型,就必须实现 `Clone`。 + +`Copy` 特质实现了只通过拷贝存储在栈上的二进制位,而复制某个值;任意代码并无必要。请参阅第 4 章中 [“唯栈数据:拷贝”](Ch04_Understanding_Ownership.md#唯栈数据拷贝stack-only-data-copy),了解更多有关 `Copy` 的信息。 + +`Copy` 特质没有定义阻止编程者过载那些方法,及破坏不会有任意代码运行这个假设的任何方法。那样的话,所有编程者就都可以假定,拷贝值将会非常快。 + +咱们可在其组成部分都实现了 `Copy` 的任何类型上派生 `Copy` 特质。由于实现 `Copy` 的类型,都有着执行与 `Copy` 同样任务的一个 `Clone` 的简单实现,因此实现 `Copy` 的类型必须同时实现 `Clone`。 + +很少需要 `Copy` 特质;实现了 `Copy` 的类型,有着可供选择的优化方案,意味着咱们不必调用 `clone`,而调用 `clone` 会令到代码更简洁。 + +对于 `Copy` 下每种可能情况,咱们都可同时以 `Clone` 完成,除了代码可能更慢,或在一些地方不得不使用 `clone`。 +### 用于将值映射到固定大小值的 `Hash` + +**`Hash` for Mapping a Value to a Value of Fixed Size** + + +`Hash` 特质实现了取某种任意大小类型的实例,并通过使用散列函数,将那个实例映射到固定大小的值。派生 `Hash` 会实现 `hash` 方法。`hash` 放的派生实现,会将在该类型各个组成部分上调用 `hash` 的结果结合起来,这就意味着值的全部字段,都必须同时实现 `Hash` 来派生 `Hash`。 + +要求 `Hash` 的一个示例,便是为了高效地存储数据,而在 `Hash` 中存储那些键时。