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

问题描述 投票:0回答:1

我想要一个可扩展的字典,将

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 {
...
}
rust static hashmap
1个回答
29
投票

这可以通过

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");
}
© www.soinside.com 2019 - 2024. All rights reserved.