|
|
|
@ -72,7 +72,7 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
|
|
|
|
|
#### RefCell 为何存在
|
|
|
|
|
相信肯定有读者有疑问了,这么做有任何意义吗?还不如在编译期报错,至少能提前发现问题,而且性能还更好。
|
|
|
|
|
|
|
|
|
|
存在即合理,究其根因,在于 Rust 编译期的**宁可错杀,绝不放过**的原则, 当编译器不能确定你的代码是否正确时,就统统会判定为错误,因此难免会导致一些误报。
|
|
|
|
|
存在即合理,究其根因,在于 Rust 编译期的**宁可错杀,绝不放过**的原则,当编译器不能确定你的代码是否正确时,就统统会判定为错误,因此难免会导致一些误报。
|
|
|
|
|
|
|
|
|
|
而 `RefCell` 正是**用于你确信代码是正确的,而编译器却发生了误判时**。
|
|
|
|
|
|
|
|
|
@ -214,7 +214,7 @@ fn main() {
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
上面代码中,我们使用 `RefCell<String>` 包裹一个字符串,同时通过 `Rc` 创建了它的三个所有者:`s`、`s1`和`s2`,并且通过其中一个所有者 `s2` 对字符串内容进行了修改。
|
|
|
|
|
上面代码中,我们使用 `RefCell<String>` 包裹一个字符串,同时通过 `Rc` 创建了它的三个所有者:`s`、`s1`和`s2`,并且通过其中一个所有者 `s2` 对字符串内容进行了修改。
|
|
|
|
|
|
|
|
|
|
由于 `Rc` 的所有者们共享同一个底层的数据,因此当一个所有者修改了数据时,会导致全部所有者持有的数据都发生了变化。
|
|
|
|
|
|
|
|
|
|