在运行时使用lazy_static初始化Rust常量

使用lazy_static初始化Rust常量

使用延迟初始化定义非常量静态变量

由Christian Lue在Unsplash上的照片

毫无疑问,在编程中,将常量在编译时进行初始化是一个很好的实践。这样不仅可以减少初始化开销,而且还可以通过提前知道常量的值,让编译器聪明地优化您的代码。

然而,有时候不可能在编译时初始化每个常量,因为它需要执行非常量操作或仅在运行时才可用的数据。例如,假设我们在程序中反复使用数字√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

如果我们试图使用环境变量初始化常量,情况也是如此:

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库,只需将其添加到项目的依赖项中即可