如何使用非平凡的初始化程序声明/管理常量



我想在main.rs文件的顶部初始化一些常量,如下所示:

const PRIVATE_KEY: Vec<u8> = std::fs::read("./jwtRS256.key").unwrap();
const PUBLIC_KEY: Vec<u8> = std::fs::read("./jwtRS256.pub.key").unwrap();
fn main () {
// do some stuff
}

然而,我得到了一个编译器错误如下:

error[E0015]: calls in constants are limited to constant functions, tuple structs and tuple variants
--> src/main.rs:16:30
|
16 | const PRIVATE_KEY: Vec<u8> = std::fs::read("./jwtRS256.key").unwrap();
|                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

我理解;有道理。编译器希望能够在编译时计算这些常量的值,但它做不到。不过,还有什么选择呢?我需要这些常量在我的代码中都可用,包括在其他模块中。因此,我不能将它们作为正则变量移动到main函数中。我该怎么办?(我在Rust 1.47上。(

有两种可能性,您想要哪一种还不清楚:

将文件的内容嵌入到二进制文件中

include_bytes和include_str将在编译期间读取文件,并将其内容(根据编译二进制文件的机器(嵌入最终程序中。

运行时全局

如果您想在程序启动时读取文件并使这些内容全局可用,则需要lazy_staticonce_cell,它们允许运行代码在运行时初始化全局。

conststatic

无论哪种方式,static都可能是您想要的,它更接近于其他语言中的全局变量。

const更具宏性,所有对常量名称的引用都将被该值直接替换为。

这通常是你想要的,例如简单的数字(这样它们就被编译为即时数,而不是从内存加载(,但对于更复杂的类型或大量的数据,static通常是更好的选择。

如果这些文件在编译时存在,并且您的唯一目标是将它们包括在编译中,那么您可以简单地使用include_bytes!("./jwtRS256.key")。但是,如果您想在运行时读取这些文件,那么可以考虑使用lazy_static:

lazy_static! {
pub static ref PRIVATE_KEY: Vec<u8> = std::fs::read("./jwtRS256.key").unwrap();
}

这个机箱本质上允许您惰性地初始化静态变量,并在任何地方使用它们。

相关内容

最新更新