【发布时间】:2015-08-03 14:50:55
【问题描述】:
我的所有州都有一个哈希图,即HashMap<String, Rc<State>>,我想调用当前州的成员fn init(&mut self)。但我收到以下代码错误:
...
if let Some(state) = self.states.get_mut(state_id) {
(*state).init();
}
...
这是错误:
src/main.rs:70:25: 70:33 error: cannot borrow immutable borrowed content as mutable
src/main.rs:70 (*state).shutdown();`
根据文档,问题是get_mut 返回一个对状态的可变引用,而不是对可变状态的引用。那么如何获得对可变状态的引用呢?
【问题讨论】:
-
if let Some(mut state) = self.states.get_mut(state_id) {有帮助吗? -
不,已经试过了。哦,我使用
RefCells 让它工作了,但我宁愿不使用它们,因为它们速度较慢,如果我不非常小心,很容易恐慌。 -
那么您似乎想要内部可变性。 Playpen example
-
如果你不使用
Rc是可能的,但即使 theRcdocumentation 使用RefCells 来实现内部可变性。 -
是的,这与
HashMap无关。 Rust 无法推断Rc内部值的可变性,因此只要Rc不是唯一的,它就禁止突变。如果只有一个引用,您可以使用get_mut。但是,您不妨将Rc全部删除
标签: rust borrow-checker