Box<T>,Rc<T>,RefCell<T>,Weak<T>

Box

在堆上存储数据,并且可确定大小,不能共享所有权

Rc

引用计数智能指针,可以共享所有权,允许相同数据有多个所有者

RefCell

对于引用和 Box,借用规则的不可变性作用于编译时。对于 RefCell,这些不可变性作用于 运行时。对于引用,如果违反这些规则,会得到一个编译错误。而对于RefCell,违反这些规则会 panic!。。RefCell 正是用于当你确信代码遵守借用规则,而编译器不能理解和确定的时候。

类似于 Rc,RefCell 只能用于单线程场景。如果尝试在多线程上下文中使用RefCell,会得到一个编译错误。

如下为选择 Box,Rc 或 RefCell 的理由:
  • Rc 允许相同数据有多个所有者;Box 和 RefCell 有单一所有者。
  • Box 允许在编译时执行不可变(或可变)借用检查;Rc仅允许在编译时执行不可变借用检查;RefCell 允许在运行时执行不可变(或可变)借用检查。
  • 因为 RefCell 允许在运行时执行可变借用检查,所以我们可以在即便 RefCell 自身是不可变的情况下修改其内部的值。