我在看一些代码
Rc<RefCell<SomeStruct>>所以我出去读了一下Rc和RefCell之间的区别:
这里简要介绍了选择Box、Rc或RefCell的原因:
Rc支持同一数据的多个所有者;Box和RefCell只有一个所有者。
Box允许在编译时检查不可变或可变的借用;Rc只允许在编译时选中不可变的借用;
RefCell允许在运行时检查不可变或可变的借用项。因为RefCell允许在运行时检查可变的借用项,所以即使在RefCell不可变的情况下,也可以在RefCell中修改值。
因此,Rc确保许多人同时可以访问SomeStruct。但我怎样才能进入?我只看到get_mut方法,它返回一个可变的引用。但该案文解释说,"Rc只允许不可变的借款“。
如果可以以mut而不是静音方式访问Rc的对象,那么为什么需要RefCell呢?
发布于 2020-05-25 08:09:26
因此,
Rc确保了许多人同时可以访问SomeStruct。但我怎样才能进入?
通过取消引用。如果有一个类型为x的变量Rc<...>,则可以使用*x访问内部值。在许多情况下,这是隐式的;例如,您可以简单地使用x调用x.method(...)上的方法。
我只看到
get_mut方法,它返回一个可变的引用。但文中解释说,"Rc只允许不可变的借款“。
get_mut()方法可能比说明Rc只允许不可变借用的解释要新得多。此外,如果当前只有一个内部值的所有者,也就是说,如果您目前首先不需要Rc,它才会返回可变的借入。一旦有多个所有者,get_mut()就会返回None。
如果可以以mut而不是静音方式访问
Rc的对象,那么为什么需要RefCell呢?
RefCell将允许您获得可变访问,即使存在多个所有者,即使您只持有对RefCell的共享引用。它将在运行时动态检查在任何给定时间只存在单个可变引用,如果您请求第二个并发引用(或者分别为try_borrow方法返回和错误),则会出现恐慌。Rc不提供此功能。
总之,Rc为您提供了共享的所有权。内部值有多个所有者,并且引用计数可以确保数据在至少一个所有者仍然持有的情况下仍然有效。如果您的数据没有明确的单一所有者,这是非常有用的。RefCell为您提供了内部可更改性,即您可以在运行时动态地借用内部值,甚至可以使用共享引用对其进行修改。组合Rc<RefCell<...>>给出了两者的组合--一个具有多个所有者的值,任何一个所有者都可以随意借用。
欲知更多详情,请参阅“锈书”的相关章节:
https://stackoverflow.com/questions/61997859
复制相似问题