Rust 如何使用非平凡的初始化器声明/管理常量
我想初始化Rust 如何使用非平凡的初始化器声明/管理常量,rust,Rust,我想初始化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 } const PRI
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
}
const PRIVATE_KEY:Vec=std::fs::read(“./jwtRS256.KEY”).unwrap();
const PUBLIC_KEY:Vec=std::fs::read(“./jwtRS256.pub.KEY”).unwrap();
fn main(){
//做点什么
}
但是,我得到一个编译器错误,如下所示:
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();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0015]:常量中的调用仅限于常量函数、元组结构和元组变量
-->src/main.rs:16:30
|
16 | const PRIVATE_KEY:Vec=std::fs::read(“./jwtRS256.KEY”).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
我明白;有道理。编译器希望能够在编译时计算这些常量的值,但它不能。但是,还有什么选择呢?我需要这些常量在我的代码中始终可用,包括在其他模块中。因此,我不能将它们作为正则变量移动到
main
函数中。我该怎么办?(我是Rust 1.47。)有两种可能性,但您想要哪一种还不清楚:
将文件的内容嵌入到二进制文件中
并将在编译期间读取文件,并将其内容(根据编译二进制文件的机器)嵌入最终程序中
运行时全局
如果您希望在程序启动时读取文件并使这些内容全局可用,您希望或者相反,它们允许运行的代码在运行时初始化全局
const
vstatic
static
可能是您想要的,它更接近其他语言中的globals
const
更像宏,所有对const名称的引用都将直接替换为值
这通常是您想要的,例如简单的数字(这样它们可以立即编译,而不是从内存加载),但对于更复杂的类型或大量的数据,
静态
通常是更好的选择。如果这些文件在编译时存在,并且您的唯一目标是将它们包含在编译中,然后,您可以简单地使用include_字节!(“/jwtRS256.key”)
。但是,如果您想在运行时读取这些文件,那么请考虑使用:
lazy\u static!{
pub static ref PRIVATE_KEY:Vec=std::fs::read(“./jwtRS256.KEY”).unwrap();
}
这个板条箱基本上允许您惰性地初始化静态变量并在任何地方使用它们。OP的示例在运行时读取文件(如果有效的话)。这有点不清楚,所以我将添加一个关于惰性静态/一次性单元格的简介。另外,
const
不是“扩展”的@SvenMarnach,这是因为整数常量内联时速度更快,但编译器不需要内联它们。答案声称情况并非如此,这是错误的,因为对实现没有这样的要求。@Masklin不,官方参考文献没有这样说。它说“本质上是内联的”来解释语义,而不是实现。它澄清了地址可能不同(但可能不同),它们可能稳定,也可能不稳定。简言之,它给了实现做任何最好的事情的自由。如果字符串文字足够小且地址未被占用,则可以(在许多情况下)在代码中内联字符串文字。没有人说字符串文本保证共享或不共享。然而,声称他们从未被分享是错误的。