跳转至

静态变量

不同于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());

LazyLockLazyCell 的最大区别是前者线程安全,相关代码如下。如果你还不太懂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,但是他并没有真正的锁,不能把非线程安全的类型变成线程安全。所以如果想要可变引用,还是得老老实实加锁。