如何在 Rust 中预加载lazy_static变量?

How to preload lazy_static variables in Rust?

提问人:Konrad Höffner 提问时间:8/31/2022 最后编辑:Konrad Höffner 更新时间:9/1/2022 访问量:83

问:

我使用 Rust 的 lazy_static crate 将常用的数据库对象分配给全局变量,但我不想延迟加载。有没有办法触发lazy_static来预加载变量,或者有没有更好的方法来实现这一点?数据库的所有功能都很昂贵,似乎不足以分配引用。

lazy_static! {
    static ref DB: DataBase = load_db();
}
 
/// this is too slow
#[allow(unused_must_use)] 
pub fn preload1() { DB.slow_function(); }

/// this does not cause lazy static to trigger
pub fn preload2() { let _ = &DB; }
惰性静态

评论

1赞 PitaJ 9/1/2022
应该是还是反之亦然?GRAPHDB
0赞 Chayim Friedman 9/1/2022
Nit:不要使用,使用,它的 API 将集成到 std 中,现在甚至被编译器推荐lazy_staticonce_cell
0赞 Konrad Höffner 9/1/2022
@PitaJ:是的,我忘了把它从真实代码改成例子,谢谢你注意到我!我修好了。
0赞 Konrad Höffner 9/1/2022
@ChayimFriedman:我会这样做的!有趣的是,编译器推荐了一个外部库,我以前从未见过任何语言。
1赞 Chayim Friedman 9/1/2022
@KonradHöffner 这是否应该实现确实是值得怀疑的,但现在主要是因为它将成为标准库的一部分。

答:

1赞 PitaJ 9/1/2022 #1

_ 不绑定,因此请使用变量名称(带有前导下划线以避免 lint):

use lazy_static::lazy_static; // 1.4.0

struct DataBase;
fn load_db() -> DataBase {
    println!("db loaded");
    DataBase
}

lazy_static! {
    static ref DB: DataBase = load_db();
}

fn main() {
    let _db: &DataBase = &*DB; // prints "db loaded"
}

操场

评论

1赞 Chayim Friedman 9/1/2022
问题不在于,而在于应该如此。另一种解决方案是键入 annotate 以强制执行 deref 强制,即使使用 ._&&*&DataBase_