如何从HashMap中获取可变结构体?

2023-12-07

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


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

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

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

有一种方法可以解决这个问题Rc, 使用内部可变性与类似的类型Cell<U> or RefCell<U>.

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

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

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

Links

  • Rust Book:选择你的保证(细胞类型)
  • 回顾 Rust 的历史:想象一下再也不会听到“可别名、可变”这个短语 (2012)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从HashMap中获取可变结构体? 的相关文章

随机推荐