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
每月下载量51次
14KB
163 代码行
✨ 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