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 中使用
6KB
56 行
✨ 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