【问题标题】:Create immutable HashMap from Cargo build script从 Cargo 构建脚本创建不可变的 HashMap
【发布时间】:2020-04-21 12:28:47
【问题描述】:

我正在使用类似于 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 并将其加载到main.rs 中的const?如果我用类似 data.insert(&lt;key&gt;,&lt;value&gt;); 的 HashMap 定义替换链接答案中使用的元组向量方法,我可以以同样的方式将其加载到 main.rsinclude! 中,保持 HashMap 不可变吗?

非常感谢! 问候

【问题讨论】:

标签: rust hashmap immutability rust-cargo


【解决方案1】:

创建全局只读 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 生成的代码中,但发生的事情就不太明显了。

【讨论】:

    猜你喜欢
    • 2019-02-24
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 2016-01-25
    • 2019-02-10
    相关资源
    最近更新 更多