我想在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_static
或once_cell
,它们允许运行代码在运行时初始化全局。
const
与static
无论哪种方式,static
都可能是您想要的,它更接近于其他语言中的全局变量。
const
更具宏性,所有对常量名称的引用都将被该值直接替换为。
这通常是你想要的,例如简单的数字(这样它们就被编译为即时数,而不是从内存加载(,但对于更复杂的类型或大量的数据,static
通常是更好的选择。
如果这些文件在编译时存在,并且您的唯一目标是将它们包括在编译中,那么您可以简单地使用include_bytes!("./jwtRS256.key")
。但是,如果您想在运行时读取这些文件,那么可以考虑使用lazy_static:
lazy_static! {
pub static ref PRIVATE_KEY: Vec<u8> = std::fs::read("./jwtRS256.key").unwrap();
}
这个机箱本质上允许您惰性地初始化静态变量,并在任何地方使用它们。