Update Ch15

This commit is contained in:
Unisko PENG 2023-05-11 09:03:51 +08:00
parent 426a335ec1
commit 11fc1408cd
2 changed files with 10 additions and 7 deletions

View File

@ -783,16 +783,15 @@ $ cargo run
由于某些分析是不可行的,那么如果 Rust 编译器不能确定代码符合所有权规则,他可能会拒绝某个正确的程序;从这方面讲,他是保守的。如果 Rust 编译器接受了错误的程序,用户就无法相信 Rust 做出的保证。然而,如果 Rust 拒绝了某个正确的程序,编程者会感到不便,但又不会发生什么灾难性的事情。在咱们确定咱们的代码遵循借用规则,而编译器无法理解和保证时,`RefCell<T>` 类型就很有用。
`Rc<T>` 类似,`RefCell<T>` 仅用于一些单线程场景中,并在咱们尝试将其用于多线程语境中时,将给到一个编译时报错。在第 16 章将讲到怎样在多线程的程序中,获得 `RefCell<T>` 的功能。
`Rc<T>` 类似,`RefCell<T>` 只适用于单线程场景,如果咱们试图在多线程环境下使用它,会出现编译时错误。我们将在第 16 章讨论如何在多线程程序中获得 `RefCell<T>` 的功能。
以下为因何原因而选择 `Box<T>`、`Rc<T>` 或 `RefCell<T>` 的总结:
下面是对选择 `Box<T>`、`Rc<T>` 或 `RefCell<T>` 理由的总结:
- `Rc<T>` 实现了同一数据的多个所有者;`Box<T>` 与 `RefCell<T>` 都有着单个所有者;
- `Box<T>` 实现了编译时的可变或不可变借用检查;`Rc<T>` 仅实现了编译时的不可变借用检查;`RefCell<T>` 则实现了在运行时的可变及不可变借用检查;
- 由于 `RefCell<T>` 实现了运行时的可变借用检查,因此即是某个 `RefCell<T>` 是不可变的,咱们也可以其内部的值。
修改某个不可变值内部的值,即为 *内部可变性* 模式the *interior mutability* pattern。接下来就要看一个其中内部可变性有用的示例并检视内部可变性是如何可行的。
- `Rc<T>` 使同一数据有多个所有者;`Box<T>` 和 `RefCell<T>` 有单一所有者;
- `Box<T>` 允许在编译时检查不可变或可变的借用;`Rc<T>` 只允许在编译时检查不可变的借用;`RefCell<T>` 允许在运行时检查不可变或可变的借用;
- 因为 `RefCell<T>` 允许在运行时检查可变的借用,所以即使 `RefCell<T>` 是不可变的,咱们也可以改变 `RefCell<T>` 中的值。
改变不可变值内部的值,就是 *内部可变性模式the interior mutablity pattern*。让我们看一下内部可变性有用的一种情况,并检视其如何可行。
### 内部可变性:到不可变值的可变借用

View File

@ -880,6 +880,10 @@ A tuple struct, 形式为 `struct MyBox<T>(T)`,是保持着只有一个元素
The Rust Prelude, `std::prelude` 模组。前奏是 Rust 自动导入到每个 Rust 程序中的东西的列表。他被保持在尽可能小的范围内,并且专注于几乎每个 Rust 程序都会用到的东西,特别是特质。参见:[`std::prelude`](https://doc.rust-lang.org/std/prelude/index.html)。
- 内部可变性模式
The interior mutability pattern, Rust 的一种设计模式,用于改变不可变值内部的某个值。
- 关联类型
An associated type, 通过 `type Target = t;` 这种语法声明出的类型,是声明泛型参数的一种稍微不同的方式。