[英]Difference between borrow_mut on a RefCell<X> and RefCell<&X>
如果我得到正确,不可能通过创建一个可变借std::rc::Rc
拉斯特,你必须使用Cell
或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强制如何工作), 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.