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