mirror of
https://github.com/gnu4cn/rust-lang-zh_CN.git
synced 2024-12-26 04:40:33 +08:00
Update Ch15
This commit is contained in:
parent
9209bff81e
commit
086b7edaff
@ -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 为咱们自动处理这些转换。
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user