编译时从文件内容生成常量



假设我有一个文件,里面有一些常量。该文件可能来自不同的服务,对于不同的场景也可能不同。现在我想从我的程序中挤出每一点性能,希望编译器做尽可能多的优化,如果需要,我会为每个场景单独编译项目。

是否有一种方法可以在编译时将文件通过一些转换逻辑转换为rust代码,例如生成一些常量,并编译结果(所有在rust工具内,没有其他代码生成)?

如果你在crate的根目录下写一个build.rs文件,它将在每次crate编译时被编译并运行。

它通常用于构建C绑定之类的,但没有什么可以阻止你为自己的目的使用它。

通常这个build.rs在输出目录的某个地方创建一个Rust源文件,读取OUT_DIR环境变量:

fn main() {
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-changed=data.txt");
let out_dir = std::env::var_os("OUT_DIR").unwrap();
let path = std::path::Path::new(&out_dir).join("test.rs");
std::fs::write(&path, "pub fn test() { todo!() }").unwrap();
}

然后源代码包含在你的项目中,通常在它自己的模块中:

mod test {
include!(concat!(env!("OUT_DIR"), "/test.rs"));
}

您可以直接生成包含常量的rust源文件。

这些部分可以使用任何语言:

  1. 生成想要用作常量的数据
  2. 使用一些字符串操作将它们作为常量保存到rust源文件中
  3. 生锈的

:

  1. pub mod const_fileinpath/to/mod.rs
  2. use path::to::const_file::MY_CONST;
  3. cargo build你的rust程序

python获取常量数组的示例:

array = [0, 10, 34]
const_file_str = f"pub const MY_CONST: [u16; 3] = {array};n"
with open("path/to/const_file.rs", "w") as rust_file:
rust_file.write(const_file_str)

最新更新