为什么采用不可变`&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


以上是为什么采用不可变`&amp;self`的方法可以使用互斥锁修改字段中的数据?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>