首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >认识Rc<RefCell<SomeStruct>>在锈病中的应用

认识Rc<RefCell<SomeStruct>>在锈病中的应用
EN

Stack Overflow用户
提问于 2020-05-25 07:40:47
回答 1查看 5K关注 0票数 13

我在看一些代码

代码语言:javascript
复制
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呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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<...>>给出了两者的组合--一个具有多个所有者的值,任何一个所有者都可以随意借用。

欲知更多详情,请参阅“锈书”的相关章节:

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61997859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档