Update Ch15

This commit is contained in:
Unisko PENG 2023-05-09 14:39:14 +08:00
parent 3bf21ebb0e
commit 20df37f349

View File

@ -469,12 +469,12 @@ fn main() {
- 当 `T: DerefMut<Target=U>` 时,会从 `&mut T` 转换为 `&mut U`;
- 当 `T: Deref<Target=U>` 时,会从 `&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**