繁体   English   中英

RefCell上borrow_mut的区别 <X> 和RefCell &lt;&X&gt;

[英]Difference between borrow_mut on a RefCell<X> and RefCell<&X>

如果我得到正确,不可能通过创建一个可变借std::rc::Rc拉斯特,你必须使用CellRefCell 但无论如何我无法理解如何使用它们。 例如,考虑这个简单的例子

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

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

问题源于您在RefCell存储了不可变引用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM