Update Ch15

This commit is contained in:
Unisko PENG
2023-05-10 17:51:17 +08:00
parent 762092d0eb
commit e942eebaeb

View File

@@ -748,14 +748,13 @@ $ cargo run
在 c 超出作用域后,引用计数为 2
```
可以看出,变量 `a` 中的 `Rc<List>` 有着初始引用计数 `1`随着在每次调用 `clone` 时,该计数就会上升 `1`。在变量 `c` 超出作用域时,计数降低了 `1`。与必须调用 `Rc::clone` 来提升该引用计数不同,咱们不必调用个函数,来降低引用计数:在某个 `Rc<T>` 值超出作用域时,`Drop` 特质实现会自动降低引用计数。
我们可以看 `a` 中的 `Rc<List>` 初始引用计数 `1`然后每次我们调用 `clone`,计数都会增加 `1`。 `c` 超出作用域时,计数会减少 `1`。我们不必像调用 `Rc::clone` 增加引用计数那样调用个函数来减少引用计数: `Rc<T>` 值超出作用域时,`Drop` 特质实现会自动减少引用计数。
在这个示例中,咱们无法见到的是, `b` 及随后的 `a` `main` 结束处超出作用域时,计数就会是 `0`同时这个 `Rc<List>` 被完全清除。使用 `Rc<T>` 就实现了单个的值,有着多个所有者,同时这种计数确保了该值在任意这些所有者存在期间,保持有效。
我们在这个例子中看不到的是, `b` `a` `main` 的末尾超出作用域时,计数 `0`并且 `Rc<List>` 被完全清除。使用 `Rc<T>` 允许单个值拥有多个所有者,而计数确保只要任何所有者仍然存在,该值就保持有效。
通过不可变引用,`Rc<T>` 实现了程序的个部分之间,只读地共用数据。在 `Rc<T>` 也实现了有着多个可变引用时,就会违反第 4 章中,曾讨论过的借用规则之一:到同一处所的多个可变借用,会导致数据竞争与不一致问题。然而能够修改数据是非常有用的!那么在接下来的小节就会讨论内部可变性模式the interior mutability pattern与那个可结合 `Rc<T>` 值,用来解决这种不可变限制问题的 `RefCell<T>` 类型the `RefCell<T>` type that you can use in conjunction with an `Rc<T>` to work with this immutability restriction
通过不可变引用,`Rc<T>` 允许咱们在程序的个部分之间共用数据,仅供读取。如果 `Rc<T>` 还允许咱们有多个可变引用,咱们可能会违反第四章中讨论的一个借用规则:对同一个地方的多个可变借用,会导致数据竞赛和不一致。但是,能够修改数据是非常有用的!在下一节中,我们将讨论内部可变性模式和 `RefCell<T>` 类型,咱们可以将其与 `Rc<T>` 结合起来使用,以应对这种不可变性限制
## `RefCell<T>` 及内部可变性模式
## `RefCell<T>` 与内部可变性模式
**`RefCell<T>` and the Interior Mutability Pattern**