[英]How to get mutable struct from HashMap?
我有一个针对我所有状态的HashMap<String, Rc<State>>
,它是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中的一个基本思想是: 别名或可变性,但不能同时存在。
混叠意味着具有指向相同值的多个活动指针。
什么是Rc<T>
? 它共享所有权,给值起别名。 因此, Rc<T>
不允许对内部的值进行突变。
使用Rc
可以解决此问题,可以将内部可变性与Cell<U>
或RefCell<U>
类的类型一起使用。
(如果编写多线程程序,则将Arc
用于线程安全共享所有权/别名,而可以将Mutex<U>
用于线程安全内部可变性。)
Rc<Cell<U>>
允许突变U
通过只允许写入和读出,但没有指针到内U
值。 没有指针,没有锯齿!
Rc<RefCell<U>>
允许通过方法.borrow_mut()
进行.borrow_mut()
,该方法将在运行时保留借用计数,并动态确保任何可变借用都是排他的。 没有别名,您具有可变性!
链接
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.