小编mor*_*ori的帖子

为什么采用不可变`&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());
}
Run Code Online (Sandbox Code Playgroud)

代码运行时不会出现恐慌,这意味着insert需要 immutable &self,但它仍然可以插入到地图中(被包裹在 中Mutex)。

这怎么可能?

insert服用会更好&mut self吗?要指示字段已修改...

如果 …

methods mutex immutability rust

1
推荐指数
1
解决办法
90
查看次数

标签 统计

immutability ×1

methods ×1

mutex ×1

rust ×1