为什么采用不可变`&self`的方法可以使用互斥锁修改字段中的数据?
考虑以下代码(也在操场上):
use std::{collections::HashMap, sync::Mutex};
struct MyStruct {
dummy_map: Mutex<HashMap<i64, i64>>,
}
impl MyStruct {
pub fn new() -> Self {
MyStruct {
dummy_map: Mutex::new(Default::default()),
}
}
pub fn insert(&self, key: i64, val: i64) { // <-- immutable &self
self.dummy_map.lock().unwrap().insert(key, val); // <-- insert in dummy_map
}
}
fn main() {
let s = MyStruct::new();
let key = 1;
s.insert(key, 1);
assert!(s.dummy_map.lock().unwrap().get(&key).is_some());
}
代码运行时不会出现恐慌,这意味着insert需要 immutable &self,但它仍然可以插入到地图中(被包裹在 中Mutex)。
这怎么可能?
insert服用会更好&mut self吗?要指示字段已修改...
如果dummy_map没有包含在 a 中Mutex,则代码不会编译(正如我所期望的)。看到这个游乐场。
回答
mut在 Rust 中有点用词不当,它实际上意味着“独占访问”(您需要能够改变一个值,但更通用)。在这种情况下,您显然无法获得对Mutex自身的独占访问权(因为重点是在线程之间共享它),因此您无法获得对self两者的独占访问权。但是,您可以获得对 内部数据的临时独占访问权限Mutex,此时可以对其进行变异。有点像Celland发生的事情RefCell。
THE END
二维码