hashmap - 库中的全局可变 HashMap

标签 hashmap rust libraries

<分区>

我想要一个可扩展的字典,将 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 {
...
}

最佳答案

这可以通过 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");
}

关于hashmap - 库中的全局可变 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34832583/

相关文章:

c++ - C和C++有什么关系(比较技术性的做法)

java - 使用嵌套 HashMap 实现 TRIE?

rust - 只有当 impl 标记为 `default` 时关联类型和类型参数不匹配

java - 使用批处理运行 Java + 库

rust - 从多个非根二进制文件导入非根模块

android - 禁用自动滑动。库android-menudrawer

哈希键的 Ruby 值?

android - 使用 HashMap 的多列列表中的 nullPointerException

rust - 为带有字段的枚举实现 fmt::Display