Update Ch15

This commit is contained in:
Peng Hailin, 2023-05-08 07:23:00 +08:00
parent 482a0b1cc2
commit 2ee44b7ef7
2 changed files with 13 additions and 8 deletions

View File

@ -290,14 +290,14 @@ fn main() {
*清单 15-7`Box<i32>` 上使用解引用操作符* *清单 15-7`Box<i32>` 上使用解引用操作符*
清单 15-7 与清单 15-6 之间的主要区别,就是这里将 `y` 设置为了指向 `x` 的一个拷贝值的匣子实例,而不是清单 15-6 中那样,指向 `x` 值的引用。在最后那个断言里,咱们就可以在 `y` 为引用时,曾做过的同样方式,使用解引用操作符来跟随这个匣子的指针。接下来,将通过定义咱们自己的匣子类型,来探讨到底 `Box<T>` 有何特别之处,来实现在其上使用解引用操作符的 清单 15-7 和清单 15-6 之间的主要区别在于,这里我们将 `y` 设置为指向 `x` 的拷贝值的 `Box<T>` 实例,而不是指向 `x` 值的引用。在最后的断言中,我们可以使用解除引用操作符来跟随 `Box<T>` 的指针,就像我们在 `y` 是一个引用时一样。接下来,我们将探讨 `Box<T>` 有什么特别之处,使我们能够通过定义我们自己的类型来使用解引用操作符
### 定义咱们自己的灵巧指针 ### 定义咱们自己的灵巧指针
接下来就要构建出一个,类似于由标准库所提供的 `Box<T>` 类型的灵巧指针,而感受一下灵巧指针默认情况下,是怎样不同于引用的。随后就将看看,如何添加这种使用解引用操作符的能力。 咱们来建立一个类似于标准库提供的 `Box<T>` 类型的灵巧指针,以体验灵巧指针的行为与默认的引用有什么不同。然后咱们将看看如何增加使用解除引用操作符的能力。
`Box<T>` 最终被定义为有着一个元素的元组结构体a tuple struct因此清单 15-8 就以同样方式,定义了一个 `MyBox<T>` 类型。这里还将定义一个 `new` 函数,来与定义在 `Box<T>` 上的那个 `new` 函数相匹配 `Box<T>` 最终被定义为了具有一个元素的元组结构体a tuple struct因此清单 15-8 以同样方式,定义了一个 `MyBox<T>` 类型。咱们还将定义一个 `new` 函数,来匹配在 `Box<T>` 上定义的 `new` 函数
文件名:`src/main.rs` 文件名:`src/main.rs`
@ -311,11 +311,11 @@ impl<T> MyBox<T> {
} }
``` ```
*清单 15-8定义出一个 `MyBox<T>` 类型* *清单 15-8定义 `MyBox<T>` 类型*
这里定义了一个名为 `MyBox` 的结构体,并由于这里想要这个类型保存任意类型的值,而声明了一个泛型参数 `T`。该 `MyBox` 类型是个有着一个类型 `T` 元素的元组结构体。其中的 `MyBox::new` 函数会取一个类型 `T` 的参数,并返回保持着所传入值的一个 `MyBox` 实例 我们定义了一个名为 `MyBox` 的结构,并声明了一个通用参数 `T`,因为我们希望我们的类型可以容纳任何类型的值。`MyBox` 类型是一个元组结构,其中一个元素为 `T` 类型。`MyBox::new` 函数接收一个 `T` 类型的参数,并返回一个 `MyBox` 实例,该实例保存着传入的值
接下来尝试把清单 15-7 中的 `main` 函数,添加到清单 15-8 并将其修改为,使用这个上面定义的 `MyBox<T>` 类型而非 `Box<T>`。由于 Rust 不清楚怎样解引用 `MyBox`,因此下面清单 15-9 中的代码不会编译 我们来试着将清单 15-7 中的 `main` 函数添加到清单 15-8 中,并将其改为使用我们定义的 `MyBox<T>` 类型而不是 `Box<T>`。清单 15-9 中的代码不会被编译,因为 Rust 不知道如何解除对 `MyBox` 的引用
文件名:`src/main.rs` 文件名:`src/main.rs`
@ -329,9 +329,9 @@ fn main() {
} }
``` ```
*清单 15-9以使用引用及 `Box<T>` 同样方式,尝试使用 `MyBox<T>`* *清单 15-9试图以咱们使用引用和 `Box<T>` 的方式使用 `MyBox<T>`*
下面就是产生的编译报错: 下面就是产生的编译报错:
```console ```console
$ cargo run  ✔   $ cargo run  ✔  

View File

@ -869,6 +869,11 @@ Indirection, 匣子类型的变量,通过保存指向数据在内存堆上的
Deref coercion类似于其他语言的开箱操作。 Deref coercion类似于其他语言的开箱操作。
- 元组结构体
A tuple struct, 形式为 `struct MyBox<T>(T)`,是保持着只有一个元素元组的结构体,`Box<T>` 的数据结构为元组结构体。
- 单态化 - 单态化
所谓 *单态化monomorphization*,是指即通过把在编译后用到的具体类型填入到泛型位置,而将通用代码转换为具体代码的过程。参考 [使用泛型代码的性能问题](Ch10_Generic_Types_Traits_and_Lifetimes.md#使用泛型参数代码的性能问题)。 所谓 *单态化monomorphization*,是指即通过把在编译后用到的具体类型填入到泛型位置,而将通用代码转换为具体代码的过程。参考 [使用泛型代码的性能问题](Ch10_Generic_Types_Traits_and_Lifetimes.md#使用泛型参数代码的性能问题)。