从 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.rs
和 include!
中,保持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());
}
您可以将此逻辑移动到 build.rs
生成的代码中,但发生的事情会不那么明显。
我正在使用类似于
根据之前在 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.rs
和 include!
中,保持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());
}
您可以将此逻辑移动到 build.rs
生成的代码中,但发生的事情会不那么明显。