【问题标题】:Global mutable HashMap in a library [duplicate]库中的全局可变HashMap [重复]
【发布时间】:2016-04-22 07:36:21
【问题描述】:

我希望在我的库中拥有一个将Object&'static str 链接在一起的可扩展字典。 HashMap 似乎是正确的数据结构,但我如何使它成为全局的、在声明时初始化和可变的?

所以是这样的:

use std::collections::HashMap;

enum Object { A, B, C }

const OBJECT_STR: &'static [&'static str] = &[ "a", "b", "c" ];

static mut word_map: HashMap<&'static str, Object> = {
    let mut m = HashMap::new();
    m.insert(OBJECT_STR[0], Object::A);
    m.insert(OBJECT_STR[1], Object::B);
    m.insert(OBJECT_STR[2], Object::C);
    m
};

impl Object {
...
}

【问题讨论】:

    标签: hashmap rust libraries


    【解决方案1】:

    lazy_static crate 可以做到这一点。如他们的示例所示。由于访问静态变量的可变性是不安全的,因此需要将其包装到 Mutex 中。我建议不要将HashMap 公开,而是提供一组锁定方法,并提供对HashMap 的访问。 See this answer 关于制作一个全局可变的单例。

    #[macro_use]
    extern crate lazy_static;
    
    use std::collections::HashMap;
    use std::sync::Mutex;
    
    lazy_static! {
        static ref HASHMAP: Mutex<HashMap<u32, &'static str>> = {
            let mut m = HashMap::new();
            m.insert(0, "foo");
            m.insert(1, "bar");
            m.insert(2, "baz");
            Mutex::new(m)
        };    
    }
    
    fn main() {
        let mut map = HASHMAP.lock().unwrap();
        map.insert(3, "sample");
    }
    

    【讨论】:

      猜你喜欢
      • 2020-03-08
      • 1970-01-01
      • 2022-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      相关资源
      最近更新 更多