从 Cargo 构建脚本创建不可变的 HashMap

Create immutable HashMap from Cargo build script

我正在使用类似于 的方法将一些文件数据加载到 Rust 二进制文件中。我希望将这些数据存储在 HashMap 中,这样我就可以在主程序中按键搜索。但是,我不确定如何以确保此数据不可变的方式执行此操作。

根据之前在 build.rs 中定义的向量,我假设我可以在 main.rs 中做这样的事情:

const ALL_THE_FILES: &[(&str, &[u8])] = &include!(concat!(env!("OUT_DIR"), "/all_the_files.rs"));

fn main () {
  let all_the_files_hashmap: HashMap<&str, &[u8]> = ALL_THE_FILES.iter().cloned().collect();
  // ...
}

有什么方法可以直接从build.rs构建这个HashMap并加载到main.rs中的const?如果我将链接答案中使用的元组向量方法替换为使用 data.insert(<key>,<value>); 之类的 HashMap 定义迭代,我能否以相同的方式将其加载到 main.rsinclude! 中,保持HashMap 不可变?

非常感谢! 此致

创建全局只读哈希图的最简单方法是使用 lazy_static:

#[macro_use]
extern crate lazy_static;

use std::collections::HashMap;

const ALL_THE_FILES: &[(&str, &[u8])] = ...;

lazy_static! {
    static ref FILE_TO_DATA: HashMap<&'static str, &'static [u8]> = {
        let mut m = HashMap::new();
        for (file, data) in ALL_THE_FILES {
            m.insert(*file, *data);
        }
        m
    };
}

fn main() {
    println!("{:?}", FILE_TO_DATA.get("foo").unwrap());
}

Playground.

您可以将此逻辑移动到 build.rs 生成的代码中,但发生的事情会不那么明显。