如果我正确理解,则无法在Rust中的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行调用的引用在第一种情况下应返回&&mut T,而在第二种情况下应返回&mut T。但是由于编译器应根据需要应用许多*(如果我了解deref coercion的工作原理),那么RefMut<X>::deref_mut()RefMut<&X>::deref_mut()之间应该没有区别

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

最佳答案

问题源于您已经在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();
                ^~~~

请注意第二个错误-“无法借用不可变的局部变量mutx”。这是因为您需要声明可变的mutx变量:
let mut mutx: std::cell::RefMut<&X> = rcx.borrow_mut();

这将使mutx参与DerefMut

关于reference - RefCell <X>和RefCell <&X>上的borrow_mut之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32591523/

10-12 20:47