[英]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.