7个稳定版本

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

#7 in #initialized


magic_static 中使用

MIT 协议

6KB
56

crates.io docs.rs license

magic_static

在程序开始时初始化的全局单例,是惰性初始化的替代方案。

用法

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

[dependencies]
magic_static = "*"

bare-metal

如果您的目标不支持原子操作或线程,请在您的 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