如何从HashMap获取可变结构?

时间:2015-08-03 14:50:56

标签: rust borrow-checker

我的所有状态都有一个哈希映射,这是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返回对状态的可变引用,而不是对可变状态的引用。那么我如何获得对可变状态的引用呢?

1 个答案:

答案 0 :(得分:5)

Rust的一个基本想法是:别名或可变性,但不是两者。

别名意味着有多个活动指针指向相同的值。

什么是Rc<T>?它共享所有权,为一个值设置别名。因此Rc<T>不允许改变内部的值。

使用Rc可以解决此问题,使用内部可变性Cell<U>RefCell<U>类型。

(如果你编写一个多线程程序,你将Arc用于线程安全的共享所有权/别名,你可以使用Mutex<U>代替线程安全的内部可变性。)

  • Rc<Cell<U>>允许通过仅允许写入和读出来改变U,但不指向内部U值的指针。没有指针,没有别名!

  • Rc<RefCell<U>>允许通过方法.borrow_mut()进行变异,该方法将在运行时保持借位数并动态确保任何可变借位都是独占的。没有别名,你有可变性!

链接