全局可变HashMap在库中的应用

17
我想在我的库中建立一个可扩展的字典,将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个回答

27
这可以通过使用 lazy_static 创建实现。就像在他们的示例中所看到的那样。由于可变性访问静态变量是不安全的,需要将其包装在 Mutex 中。我建议不要公开 HashMap,而是提供一组方法来锁定并提供对 HashMap 的访问。请参阅此答案以创建全局可变单例。
#[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");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接