我想在我的图书馆里有一本可扩展字典,把Object&'static str连接起来.HashMap似乎是适合这种情况的数据 struct ,但我如何使其全球化、基于声明初始化和可变?

比如:

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 crate .正如他们的例子所示.由于访问静态变量的易变性是不安全的,因此需要将其包装到一个Mutex中.我建议不要公开HashMap,而是提供一组锁定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");
}

Rust相关问答推荐

为什么我需要在这个代码示例中使用&

使用元组执行条件分支的正确方法

使用 struct 外部的属性来改变 struct 的原始方式

如何高效地将 struct 向量中的字段收集到单独的数组中

作为1字节位掩码的布尔值 struct

我如何使用AWS SDK for Rust获取我承担的角色的凭据?

为什么Option类型try块需要类型注释?

Rust中WPARAM和VIRTUAL_KEY的比较

这是什么:`impl Trait for T {}`?

我应该如何表达具有生命周期参数的类型的总排序,同时允许与不同生命周期进行比较?

详尽的匹配模式绑定

Option<&T> 如何实现复制

Rust 中指向自身的引用如何工作?

如何从 x86_64 Mac 构建 M1 Mac?

在 Rust 中如何将值推送到枚举 struct 内的 vec?

没有通用参数的通用返回

在 Rust 中为泛型 struct 编写一次特征绑定

从 Cranelift 发出 ASM

如何从 many0 传播 Nom 失败上下文?

在 Rust 中有条件地导入?