首页 文章

库中的全局可变HashMap [重复]

提问于
浏览
4

这个问题在这里已有答案:

我希望在我的库中有一个可扩展的字典 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 {
...
}

1 回答

  • 8

    使用lazy_static箱可以实现这一点 . 如他们的例子所示 . 由于访问静态变量的可变性是不安全的,因此需要将其包装成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");
    }
    

相关问题