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