mirror of
https://github.com/gnu4cn/rust-lang-zh_CN.git
synced 2024-12-27 13:21:09 +08:00
Update Ch15
This commit is contained in:
parent
482a0b1cc2
commit
2ee44b7ef7
@ -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 ✔
|
||||||
|
@ -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#使用泛型参数代码的性能问题)。
|
||||||
|
Loading…
Reference in New Issue
Block a user