Kil*_*KRT 5 reference mutability rust interior-mutability
如果我猜对了std::rc::Rc,就不可能在 Rust 中通过a创建可变借用,您必须使用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();
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
16:5: 16:9 error: cannot borrow immutable local variable `mutx` as mutable
16 mutx.foo();
Run Code Online (Sandbox Code Playgroud)
但是,如果我从行中删除引用(并更新类型mutx):
let rcx = RefCell::new(x);
Run Code Online (Sandbox Code Playgroud)
一切安好。但我不明白为什么,因为RefMut::deref_mut() -> &mut T在第 16 行调用的尊重应该&&mut T在第一种情况下返回,而&mut T在第二种情况下。但是由于编译器应该*根据需要应用很多(如果我知道deref 强制是如何工作的),那么RefMut<X>::deref_mut()和RefMut<&X>::deref_mut()
编辑:我错误地忘记mut在第 15 行写,因为在链接的示例中写得正确。所以现在是let mut mutx...
问题源于您在RefCell. 我不清楚你为什么想要这样的东西。正常模式是将整个值放入RefCell,而不仅仅是一个引用:
fn main () {\n let rcx = RefCell::new(X(5));\n\n let mut mutx = rcx.borrow_mut();\n mutx.foo();\n}\nRun Code Online (Sandbox Code Playgroud)\n\n原始问题的问题
\n\n你有两个复合错误。让我们检查一下整个错误消息:
\n\n<anon>:16:5: 16:12 error: cannot borrow immutable borrowed content as mutable\n<anon>:16 (*mutx).foo();\n ^~~~~~~\n<anon>:16:7: 16:11 error: cannot borrow immutable local variable `mutx` as mutable\n<anon>:16 (*mutx).foo();\n ^~~~\nRun Code Online (Sandbox Code Playgroud)\n\n请注意第二个错误 \xe2\x80\x94“无法借用不可变局部变量mutx”。那是因为你需要声明mutx变量可变:
let mut mutx: std::cell::RefMut<&X> = rcx.borrow_mut();\nRun Code Online (Sandbox Code Playgroud)\n\n这将允许mutx参与DerefMut。