我正在使用与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.rs
和include!
中,以保持HashMap不可变?
非常感谢!问候
创建全局只读哈希图的最简单方法是使用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.生成的代码中,但是发生的情况要少得多。