#global #singleton #static #lazy-static

无std magic_static

全局单例在程序启动时初始化,是延迟初始化的替代方案

9个稳定版本

3.0.3 2022年6月11日
3.0.1 2021年12月12日
2.0.1 2021年11月19日
1.2.0 2021年11月12日

Rust模式中排名第1614

Download history 17/week @ 2024-03-09 2/week @ 2024-03-16 39/week @ 2024-03-30 9/week @ 2024-04-06 1/week @ 2024-05-18

每月下载量51

MIT授权

14KB
163 代码行

crates.io docs.rs license

magic_static

全局单例在程序启动时初始化,是延迟初始化的替代方案。

使用方法

只需将magic_static作为依赖项添加到您的Cargo.toml中即可开始使用

[dependencies]
magic_static = "*"

裸机

如果您的目标不支持原子操作或线程,请在您的Cargo.toml中启用bare-metal功能标志

[dependencies]
magic_static = { version = "*", features = ["bare-metal"] }

示例

#[macro_use]
extern crate magic_static;

mod foo {
    magic_statics! {
        pub(super) static ref MAGIC: usize = {
            println!("Magic!");
            42
        };

        pub(super) static ref BAR: std::sync::Mutex<()> = std::sync::Mutex::new(());
    }
}

// You can also modularize your magic statics in a group at the module level like so:
// See `main()` for how to initialize these magic statics.
mod baz {
    magic_statics_mod! {
        pub(super) static ref MAGIC: usize = {
            println!("Magic!");
            42
        };

        pub(super) static ref BAR: std::sync::Mutex<()> = std::sync::Mutex::new(());
    }
}

// You can also decorate statics to make them magic statics
#[magic_static]
static FOO_BAR: std::thread::JoinHandle<()> = {
    std::thread::spawn(move || {
        loop { println!("HELP I CANT STOP SPINNING"); }
    })
};

#[magic_static::main(
    FOO_BAR,

    foo::MAGIC,
    foo::BAR,

    mod baz // This will initialize all magic statics in the `baz` module
)]
fn main() {
    println!("Hello, world!");
}

lazy_static的比较

lazy_static在首次使用时进行初始化,面向多线程应用程序。

每次解引用lazy_static时,都必须检查它是否已初始化。这通常非常便宜,生成的引用可以存储在热循环(例如)中使用,但在某些情况下,您可能更喜欢完全没有检查,即更轻量级的解决方案。

magic_static只在调试构建时执行这些检查,使其成为单线程和性能关键应用程序的更舒适选择。

使用magic_static的缺点是您必须手动在main函数或适当的某个地方初始化每个magic_static。请参阅上面的示例。

依赖项

约1.5MB
约35K SLoC