5

如果我理解正确,则不可能在 Rust 中通过a创建可变借用std::rc::Rc,您必须使用Cellor RefCell。但无论如何我无法理解如何使用它们。例如考虑这个简单的例子

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 coercionRefMut<X>::deref_mut()是如何工作的),和之间应该没有区别RefMut<&X>::deref_mut()

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

4

1 回答 1

4

问题源于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

于 2015-09-15T17:10:48.453 回答