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

问题描述 投票:0回答:2

假设我有一个文件,其中包含一些常量。该文件可能来自不同的服务,并且对于不同的场景可能有所不同。现在我想从程序中榨取最后一点性能,希望编译器进行尽可能多的优化,如果需要,我会为每个场景单独编译项目。

有没有办法在编译时获取文件,通过一些转换逻辑将其转换为 Rust 代码,例如生成一些常量,并编译结果(全部在 Rust 工具内,没有其他代码生成)?

rust rust-cargo
2个回答
12
投票

如果您在板条箱的根目录中编写一个

build.rs
文件,它将在每次板条箱编译时进行编译和运行。

它通常用于构建 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"));
}

1
投票

您可以生成包含常量的 Rust 源文件。

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

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

生锈:

  1. pub mod const_file
    path/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)

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