RefCell <x>上的borrow_mut与RefCell&lt;&amp; X&gt;之间的差异。

时间:2015-09-15 16:51:58

标签: reference rust mutability interior-mutability

如果我弄错了,就无法在Rust中创建一个可变的借用 over std::rc::Rc,你必须使用CellRefCell。 但无论如何我无法理解如何使用它们。例如,考虑一下这个简单的example

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();
}

我收到以下错误:

16:5: 16:9 error: cannot borrow immutable local variable `mutx` as mutable
16     mutx.foo();

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

let rcx = RefCell::new(x);

一切都很好。但是我无法理解为什么,因为RefMut::deref_mut() -> &mut T在第16行调用的deference应该在第一种情况下返回&&mut T,而在第二种情况下返回&mut T。但是,由于编译器应该根据需要应用多个*(如果我了解deref coercion的工作方式),RefMut<X>::deref_mut()RefMut<&X>::deref_mut()

之间应该没有区别

修改: 我错误地忘记在第15行写mut,因为正确编写了链接示例。所以现在是let mut mutx...

1 个答案:

答案 0 :(得分:3)

问题源于您在RefCell中存储不可变参考这一事实。我不清楚为什么你会想要这样的事情。正常模式是将整个值放入RefCell,而不仅仅是参考:

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

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

原始问题的问题

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

<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();
                ^~~~

注意第二个错误 - &#34;不能借用不可变局部变量mutx&#34;。这是因为您需要声明mutx变量mutable:

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

这将允许mutx加入DerefMut