jojoGyro 发表于 2023-07-30 11:29
这2种组合方式有什么区别
基本概念从文档看起,别只看第三手的资料。
https://doc.rust-lang.org/std/cell/index.html
https://doc.rust-lang.org/std/rc/index.html
RefCell<Rc<T>>几乎没用。
RefCell<Rc<T>>
RefCell的价值在于interior mutability,也就是说你可以通过一个&RefCell<U>获得一个&mut U。
RefCell
&RefCell<U>
&mut U
然而当U = Rc<T>的时候,你会很快发现&mut Rc<T>是没多少用处的。Rc仅有的两个需要mutable reference的方法是get_mut和make_mut,前者要求没有其它Rc或Weak指向同一块内存区域,后者则干脆是clone on write。这两个方法都意味着此时Rc和Box、Cow没什么区别,不能提供shared ownership的特性。
U = Rc<T>
&mut Rc<T>
Rc
get_mut
make_mut
Weak
Rc<RefCell<T>>的思路就是Rc<U>只能提供&U,所以需要再由RefCell的interior mutability获得&mut T,最终实现在多个地方修改同一块内存区域的目的。这个一般教程都会讲。
Rc<RefCell<T>>
Rc<U>
&U
&mut T
评论区
写评论基本概念从文档看起,别只看第三手的资料。
https://doc.rust-lang.org/std/cell/index.html
https://doc.rust-lang.org/std/rc/index.html
RefCell<Rc<T>>
几乎没用。RefCell
的价值在于interior mutability,也就是说你可以通过一个&RefCell<U>
获得一个&mut U
。然而当
U = Rc<T>
的时候,你会很快发现&mut Rc<T>
是没多少用处的。Rc
仅有的两个需要mutable reference的方法是get_mut
和make_mut
,前者要求没有其它Rc
或Weak
指向同一块内存区域,后者则干脆是clone on write。这两个方法都意味着此时Rc和Box、Cow没什么区别,不能提供shared ownership的特性。Rc<RefCell<T>>
的思路就是Rc<U>
只能提供&U
,所以需要再由RefCell
的interior mutability获得&mut T
,最终实现在多个地方修改同一块内存区域的目的。这个一般教程都会讲。