From 20df37f349006db1dea20852f2c528d742302211 Mon Sep 17 00:00:00 2001 From: Unisko PENG Date: Tue, 9 May 2023 14:39:14 +0800 Subject: [PATCH] Update Ch15 --- src/Ch15_Smart_Pointers.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Ch15_Smart_Pointers.md b/src/Ch15_Smart_Pointers.md index 0ba5cf1..5e7a1b9 100644 --- a/src/Ch15_Smart_Pointers.md +++ b/src/Ch15_Smart_Pointers.md @@ -469,12 +469,12 @@ fn main() { - 当 `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 不能假设将不可变引用转换为可变引用是可行的。 -## 使用 `Drop` 特质在清理内存时运行代码 +## 使用 `Drop` 特质运行清理代码 **Running Code on Cleanup with `Drop` Trait**