首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >borrow_mut在RefCell<X>和RefCell<&X>上的区别

borrow_mut在RefCell<X>和RefCell<&X>上的区别
EN

Stack Overflow用户
提问于 2015-09-15 16:51:57
回答 1查看 1.7K关注 0票数 5

如果我得到了正确的,它是不可能创建一个可变的借用在std::rc::Rc上的锈蚀,你必须使用CellRefCell。但无论如何,我不知道如何使用它们。例如,考虑一下这个简单的示例

代码语言:javascript
复制
use std::cell::RefCell;

struct X (i32);

impl X {
    fn foo(&mut self) {
        self.0 = 0;
    }
}

fn main () {
    let x = X(5);
    let rcx = RefCell::new(&x);

    let mut mutx: std::cell::RefMut<&X> = rcx.borrow_mut();
    (*mutx).foo();
}

我得到以下错误:

代码语言:javascript
复制
16:5: 16:9 error: cannot borrow immutable local variable `mutx` as mutable
16     mutx.foo();

但是,如果我从行中删除引用(以及更新mutx类型):

代码语言:javascript
复制
let rcx = RefCell::new(x);

百事大吉。但是我不明白为什么,因为在第16行调用的RefMut::deref_mut() -> &mut T在第一个情况下应该返回&&mut T,而在第二个情况下应该返回&mut T。但是,由于编译器应该根据需要应用许多* (如果我了解德勒夫胁迫的工作方式),RefMut<X>::deref_mut()RefMut<&X>::deref_mut()之间应该没有区别

编辑:由于错误,我忘了在第15行写mut,因为在链接的示例中正确地写了mut。所以现在是let mut mutx...

EN

回答 1

Stack Overflow用户

发布于 2015-09-15 17:10:48

问题的根源在于,您已经在中存储了一个不可变的引用。我不知道你为什么想要这样的东西。通常的模式是将整个值放入RefCell中,而不仅仅是引用:

代码语言:javascript
复制
fn main () {
    let rcx = RefCell::new(X(5));

    let mut mutx = rcx.borrow_mut();
    mutx.foo();
}

问题与原始问题

你有两个复合错误。让我们检查整个错误消息:

代码语言:javascript
复制
<anon>:16:5: 16:12 error: cannot borrow immutable borrowed content as mutable
<anon>:16     (*mutx).foo();
              ^~~~~~~
<anon>:16:7: 16:11 error: cannot borrow immutable local variable `mutx` as mutable
<anon>:16     (*mutx).foo();
                ^~~~

注意第二个错误--“无法借用不变的局部变量mutx”。这是因为您需要声明mutx变量是可变的:

代码语言:javascript
复制
let mut mutx: std::cell::RefMut<&X> = rcx.borrow_mut();

这将允许mutx参与DerefMut

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

https://stackoverflow.com/questions/32591523

复制
相关文章

相似问题

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