静态变量
不同于C语言,在Rust中创建一个静态变量并不是一件非常自然的事情。主要是为了保证静态变量要能被多线程安全的访问,加了很多限制。
在1.80 版本发布之前,想要直接调用非const函数初始化全局变量需要借助第三方库lazy_static
的帮助。但是新引入的LazyCell
and LazyLock
可以让我们避免第三方库的引入。例如:
static LOG_INVOKE_RE: LazyLock<Regex> =
LazyLock::new(|| Regex::new(r"Program ([a-zA-Z0-9]+) invoke \[(\d)\]").unwrap());
LazyLock
和 LazyCell
的最大区别是前者线程安全,相关代码如下。如果你还不太懂Rust对线程安全的规范,直接无脑使用LazyLock
就可以了。
impl<T: Sync + Send, F: Send> Sync for LazyLock<T, F>
impl<T, F = fn() -> T> !Sync for LazyCell<T, F>
btw, LazyLock
虽然名字里带 Lock,但是他并没有真正的锁,不能把非线程安全的类型变成线程安全。所以如果想要可变引用,还是得老老实实加锁。