Update Ch15

This commit is contained in:
Peng Hailin, 2023-05-09 08:02:27 +08:00
parent 9209bff81e
commit 086b7edaff

View File

@ -436,9 +436,9 @@ fn main() {
*清单 15-12使用对 `MyBox<String>` 值的引用调用 `hello`,由于解引用强制转换,其可以工作*
这里使用参数 `&m`,即到某个 `MyBox<String>` 值的引用,调用的那个 `hello` 函数。由于这里曾在清单 15-10 中的 `MyBox<T>` 上实现过 `Deref` 特质,因此 Rust 就能通过调用 `deref`,将 `&MyBox<String>` 转换为 `&String`。标准库提供了在 `&String` 上,返回一个字符串切片的 `Deref` 实现,且这一点就在 `Deref` 的 API 文档中。Rust 就会再度调用 `deref`,来将这个 `&String` 转换为 `&str`,这就与 `hello` 函数定义想吻合了
这里我们用参数 `&m` 调用 `hello` 函数,他是对 `MyBox<String>` 值的一个引用。因为我们在清单 15-10 中对 `MyBox<T>` 实现了 `Deref` 特性Rust 可以通过调用 `deref``&MyBox<String>` 变成 `&String`。标准库提供了一个 `String` 上的 `Deref` 的实现,其返回一个字符串片,这在 `Deref``API` 文档中。Rust 再次调用 `deref`,将 `&String` 变成 `&str`,这与 `hello` 函数的定义相符
若 Rust 不曾实现解引用强制转换特性,那么这里就不得不编写出下面清单 15-13 中的代码,而不是清单 15-12 中的代码,来以某个类型 `&MyBox<String>` 值调用 `hello` 了:
如果 Rust 没有实现解引用强制转换,为了用一个 `&MyBox<String>` 类型的值调用 `hello`,我们就必须写清单 15-13 中的代码,而不是清单 15-12 中的代码。
文件名:`src/main.rs`
@ -449,7 +449,7 @@ fn main() {
}
```
*清单 15-13若 Rust 没有解引用强制转换特性,而将不得不编写的代码*
*清单 15-13如果 Rust 没有解引用强制转换,我们将不得不编写的代码*
其中的 `(*m)` 将那个 `MyBox<String>` 解引用为了一个 `String`。随后的 `&``[..]`,则取了与 `hello` 函数签名相匹配,等于整个字符串的该 `String` 的字符串切片。这种不带有解引用强制转换的代码,因为涉及到全部的这些符号,而更难于阅读、编写与理解。正是解引用强制转换,实现了 Rust 为咱们自动处理这些转换。