Update Ch15

This commit is contained in:
Unisko PENG 2023-05-08 17:51:30 +08:00
parent d028894823
commit 79967cd455

View File

@ -395,16 +395,17 @@ Rust 将 `*` 运算符替换为对 `deref` 方法的调用,然后是普通的
`deref` 方法返回一个值的引用,以及 `*(y.deref())` 中括号外的普通解引用仍然是必要的,其原因与所有权系统有关。如果 `deref` 方法直接返回值,而不是返回值的引用,值就会被移出 `self`。在这种情况下,或者在大多数使用解引用操作符的情况下,我们不希望取得 `MyBox<T>` 内部的值的所有权。
请注意那个 `*` 运算符被替换为了到 `deref` 方法的一次调用,和随后到 `*` 运算符的一次调用,这替换只有一次,且咱们在代码中用到一次 `*` 运算符,这种替换就会进行一次。由于 `*` 运算符的这种替代不会无限递归,因此这里就会以类型 `i32` 的数据而结束,其正好与清单 15-9 中那个 `assert_eq!``5` 匹配。
请注意,每次我们在代码中使用 `*` 时, `*` 运算符被替换为对 `deref` 方法的调用,然后仅调用一次 `*` 运算符。因为 `*` 运算符的替换不会无限递归,所以我们最终得到类型为 `i32` 的数据,他与清单 15-9 中 `assert_eq!``5` 匹配。
### 函数与方法下的隐式解引用强制转换
**Implicit `Deref` Coercions with Functions and Methods**
**Implicit Deref Coercions with Functions and Methods**
*解引用强制转换deref coercion* 会将到实现了 `Deref` 特质的某种类型的引用,转换为到另一类型的引用。比如,由于 `String` 实现了 `Deref` 特质,因此对 `&String` 解引用强制转换,就会返回 `&str`,因此就可以把 `&String` 解引用强制转换为 `&str`。解引用强制转换,属于 Rust 在函数与方法的参数上,所执行的一项便利措施,并只在那些实现了 `Deref` 特质的类型上起作用。在将到特定类型值的引用,作为参数传递给某个函数或方法,而所传递的引用,并不与那个函数或方法定义中的参数类型想匹配时,这种解引用强制转换就会发生。这时到 `deref` 方法的一系列调用,就会把所提供的类型,转换为函数或方法定义中那些参数所需的类型。
*解引用强制转换deref coercion* 将对实现了 `Deref` 特质的某种类型的引用,转换为对另一类型的引用。例如,解引用强制转换可以将 `&String` 转换为 `&str`,因为 `String` 实现了 `Deref`,所以他会返回 `&str`。解引用强制转换是 Rust 对函数和方法的参数执行的一种便利,只对实现 `Deref` 特质的类型起作用。当我们把对某一特定类型的值的引用作为参数传递给函数或方法时,它就会自动发生,而该参数与函数或方法定义中的参数类型并不匹配。一系列对 `Deref` 方法的调用将我们提供的类型转换为参数需要的类型。
> *注*:在面向对象编程语言 Java 中,类似的特性叫 ["自动装箱"](https://java.xfoss.com/Ch10_Numbers_and_Statics_Numbers_Matter.html#%E8%87%AA%E5%8A%A8%E8%A3%85%E7%AE%B1%E6%A8%A1%E7%B3%8A%E5%8E%9F%E7%94%9F%E5%80%BC%E4%B8%8E%E5%AF%B9%E8%B1%A1%E4%B9%8B%E9%97%B4%E7%9A%84%E7%95%8C%E7%BA%BF)。
> *注*:在面向对象编程语言 Java 中,类似的特性叫 ["自动装箱"](https://java.xfoss.com/Ch10_Numbers_and_Statics_Numbers_Matter.html#自动装箱模糊原生值与对象之间的界线)。
为了程序员们在编写函数与方法调用时,无需使用 `&``*` 添加许多的那些显示引用和解引用,解引用强制转换特性就这样被添加到 Rust 了。这种解引用强制转换,还实现更多既可在引用,亦可在灵巧指针上起作用代码的编写。