从货运构建脚本创建不可变的HashMap

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

我正在使用与this answer类似的东西将某些文件数据加载到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并将其加载到const中的main.rs?如果我用像data.insert(<key>,<value>);之类的HashMap定义替换链接答案中使用的元组向量方法,是否可以以相同的方式将其加载到main.rsinclude!中,以保持HashMap不可变?

非常感谢!问候

rust hashmap immutability cargo
1个回答
0
投票

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

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.生成的代码中,但是发生的情况要少得多。

© www.soinside.com 2019 - 2024. All rights reserved.