我有一个所有状态的哈希图,它是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>
而是为了线程安全的内部可变性。)
Links
- Rust Book:选择你的保证(细胞类型)
- 回顾 Rust 的历史:想象一下再也不会听到“可别名、可变”这个短语 (2012)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)