在运行时使用lazy_static初始化Rust常量
使用lazy_static初始化Rust常量
使用延迟初始化定义非常量静态变量
毫无疑问,在编程中,将常量在编译时进行初始化是一个很好的实践。这样不仅可以减少初始化开销,而且还可以通过提前知道常量的值,让编译器聪明地优化您的代码。
然而,有时候不可能在编译时初始化每个常量,因为它需要执行非常量操作或仅在运行时才可用的数据。例如,假设我们在程序中反复使用数字√7
。与其每次计算它,不如定义一个常量如下:
const ROOT_OF_SEVEN: f64 = 7_f64.sqrt();
然而,这段代码是无效的。Rust编译器会返回以下错误:
cannot call non-const fn `f64::<impl f64>::sqrt` in constantscalls in constants are limited to constant functions, tuple structs and tuple variants
如果我们试图使用环境变量初始化常量,情况也是如此:
- LightOn AI发布了Alfred-40B-0723:一种基于Falcon-40B的新开源语言模型(LLM)
- NVIDIA CEO黄仁勋回归SIGGRAPH
- 微软因’极度不负责任’的安全问题遭到严厉批评
const LANG: String = env::var("LANG").unwrap();
来自Rust编译器的错误信息:
cannot call non-const fn `std::env::var::<&str>` in constantscalls in constants are limited to constant functions, tuple structs and tuple variants
正如您所见,某些在编译时初始化会很有用的常量需要执行非常量操作。这就是Rust的lazy_static
库派上用场的地方。lazy_static
允许您定义全局静态变量,它们在首次实际使用时才被延迟初始化,也就是说它们的值只在运行时的第一次使用时设置。惰性静态变量只需要在首次使用时初始化,而且由于这是一次性操作,它们的运行时初始化开销可以忽略不计。
在本文中,我们将介绍如何使用Rust的lazy_static
库来延迟初始化全局常量以及它们的几个用例。
使用lazy_static
要使用lazy_static
库,只需将其添加到项目的依赖项中即可