mirror of
https://github.com/gnu4cn/rust-lang-zh_CN.git
synced 2025-03-15 03:40:29 +08:00
Update Ch15
This commit is contained in:
parent
426a335ec1
commit
11fc1408cd
@ -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*。让我们看一下内部可变性有用的一种情况,并检视其如何可行。
|
||||
|
||||
### 内部可变性:到不可变值的可变借用
|
||||
|
||||
|
@ -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;` 这种语法声明出的类型,是声明泛型参数的一种稍微不同的方式。
|
||||
|
Loading…
Reference in New Issue
Block a user