mirror of
https://github.com/gnu4cn/rust-lang-zh_CN.git
synced 2026-08-19 12:43:28 +08:00
Update Ch15
This commit is contained in:
@@ -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**
|
||||
|
||||
|
||||
Reference in New Issue
Block a user