2

我的所有状态都有一个哈希图,它是 a HashMap<String, Rc<State>>,我想调用当前状态的 member 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返回对状态的可变引用,而不是对可变状态的引用。那么我如何获得对可变状态的引用呢?

4

1 回答 1

6

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

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

是什么Rc<T>?它是共享所有权,对值进行别名化。因此Rc<T>不允许改变内部的值。

有一种方法可以通过Rc, 使用内部可变性来处理像Cell<U>或之类的类型RefCell<U>

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

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

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

链接

于 2015-08-03T16:41:45.020 回答