如何从 HashMap 获取可变结构?

How to get mutable struct from HashMap?

我有一个用于我所有状态的哈希图,它是一个 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 returns 对状态的可变引用,而不是对可变状态的引用。那么我如何获得对可变状态的引用?

Rust 的一个基本思想是:别名化或可变性,但不能两者兼而有之。

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

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

Rc 有一种解决方法,可以将 内部可变性Cell<U>RefCell<U> 等类型一起使用。

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

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

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

链接