Shi*_*ien 2 rust borrow-checker
我有一个所有状态的哈希映射,这是一个HashMap<String, Rc<State>>,我想调用当前状态的成员fn init(&mut self).但是我收到以下代码的错误:
...
if let Some(state) = self.states.get_mut(state_id) {
(*state).init();
}
...
Run Code Online (Sandbox Code Playgroud)
这是错误:
src/main.rs:70:25: 70:33 error: cannot borrow immutable borrowed content as mutable
src/main.rs:70 (*state).shutdown();`
Run Code Online (Sandbox Code Playgroud)
从文档中得知,问题是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()在运行时保持借位计数的方法进行变异,并动态确保任何可变的借位都是独占的.没有别名,你有可变性!
链接
| 归档时间: |
|
| 查看次数: |
1074 次 |
| 最近记录: |