如何从HashMap获取可变结构?

Shi*_*ien 2 rust borrow-checker

我有一个所有状态的哈希映射,这是一个HashMap<String, Rc<State>>,我想调用当前状态的成员fn init(&mut self).但是我收到以下代码的错误:

...
if let Some(state) = self.states.get_mut(state_id) {
    (*state).init();
}
...
Run Code Online (Sandbox Code Playgroud)

这是错误:

src/main.rs:70:25: 70:33 error: cannot borrow immutable borrowed content as mutable
src/main.rs:70                         (*state).shutdown();`
Run Code Online (Sandbox Code Playgroud)

从文档中得知,问题是get_mut返回对状态的可变引用,而不是对可变状态的引用.那么我如何获得对可变状态的引用?

blu*_*uss 5

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

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

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

有一种解决方法Rc,使用内部可变性与类型Cell<U>RefCell<U>.

(如果编写多线程程序,则可以使用Arc线程安全共享所有权/别名,并且可以使用Mutex<U>线程安全内部可变性.)

  • Rc<Cell<U>>允许U通过只允许写入和读出进行变异,但是没有指向内部U值的指针.没有指针,没有别名!

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

链接