From 0666a11beb25ec6e381d8e70302d0beb2a0f5cec Mon Sep 17 00:00:00 2001 From: itfanr Date: Fri, 27 May 2022 14:33:57 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20ch15-02-deref.md=20(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: YangQi <2419731931@qq.com> --- src/ch15-02-deref.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/ch15-02-deref.md b/src/ch15-02-deref.md index 8c50763..d84a28a 100644 --- a/src/ch15-02-deref.md +++ b/src/ch15-02-deref.md @@ -137,7 +137,7 @@ impl Deref for MyBox { `deref` 方法体中写入了 `&self.0`,这样 `deref` 返回了我希望通过 `*` 运算符访问的值的引用。示例 15-9 中的 `main` 函数中对 `MyBox` 值的 `*` 调用现在可以编译并能通过断言了! -没有 `Deref` trait 的话,编译器只会解引用 `&` 引用类型。`deref` 方法向编译器提供了获取任何实现了 `Deref` trait 的类型的值,并且调用这个类型的 `deref` 方法来获取一个它知道如何解引用的 `&` 引用的能力。 +没有 `Deref` trait 的话,编译器只会把 `&` 引用类型解引用。`deref` 方法向编译器提供了一种能力:能够获取任何实现了 `Deref` trait 的类型的值,并且可以通过调用这个类型的 `deref` 方法来获取一个解引用方法已知的 `&` 引用。 当我们在示例 15-9 中输入 `*y` 时,Rust 事实上在底层运行了如下代码: @@ -262,12 +262,12 @@ fn main() { 类似于使用 `Deref` trait 重载不可变引用的 `*` 运算符,Rust 提供了 `DerefMut` trait 用于重载可变引用的 `*` 运算符。 -Rust 在发现类型和 trait 实现满足三种情况时会进行解引用强制转换: +Rust 在发现类型和 trait 的实现满足以下三种情况时会进行解引用强制转换: -- 当 `T: Deref` 时从 `&T` 到 `&U`。 -- 当 `T: DerefMut` 时从 `&mut T` 到 `&mut U`。 -- 当 `T: Deref` 时从 `&mut T` 到 `&U`。 +- 当 `T: Deref` :从 `&T` 到 `&U`。 +- 当 `T: DerefMut` :从 `&mut T` 到 `&mut U`。 +- 当 `T: Deref` :从 `&mut T` 到 `&U`。 -头两个情况除了可变性之外是相同的:第一种情况表明如果有一个 `&T`,而 `T` 实现了返回 `U` 类型的 `Deref`,则可以直接得到 `&U`。第二种情况表明对于可变引用也有着相同的行为。 +前两种情况除了可变性之外是相同的:第一种情况表明如果有一个 `&T`,而 `T` 实现了返回 `U` 类型的 `Deref`,则可以直接得到 `&U`。第二种情况表明对于可变引用也有着相同的行为。 -第三个情况有些微妙:Rust 也会将可变引用强转为不可变引用。但是反之是 **不可能** 的:不可变引用永远也不能强转为可变引用。因为根据借用规则,如果有一个可变引用,其必须是这些数据的唯一引用(否则程序将无法编译)。将一个可变引用转换为不可变引用永远也不会打破借用规则。将不可变引用转换为可变引用则需要数据只能有一个不可变引用,而借用规则无法保证这一点。因此,Rust 无法假设将不可变引用转换为可变引用是可能的。 +第三种情况有些微妙:Rust 也会将可变引用强转为不可变引用,但是反之是 **不可能** 的,因为不可变引用永远也不能强转为可变引用。因为根据借用规则,如果有一个可变引用,其必须是这些数据的唯一引用(否则程序将无法编译)。将一个可变引用转换为不可变引用永远也不会打破借用规则。将不可变引用转换为可变引用则需要数据只能有一个不可变引用,而借用规则无法保证这一点。因此,Rust 无法假设将不可变引用转换为可变引用是可能的。