3个不稳定版本
0.2.1 | 2024年7月25日 |
---|---|
0.2.0 | 2024年7月18日 |
0.1.0 | 2024年7月17日 |
#5 在 #懒
2,036 每月下载量
8KB
132 行
lazyinit
懒加载初始化静态值。
与将初始化例程硬编码在宏中的 lazy_static
不同,你可以以任何方式初始化值。
示例
use lazyinit::LazyInit;
static VALUE: LazyInit<u32> = LazyInit::new();
assert!(!VALUE.is_inited());
// println!("{}", *VALUE); // panic: use uninitialized value
assert_eq!(VALUE.get(), None);
VALUE.init_once(233);
// VALUE.init_once(666); // panic: already initialized
assert!(VALUE.is_inited());
assert_eq!(*VALUE, 233);
assert_eq!(VALUE.get(), Some(&233));
多个初始化中只有一个可以成功
use lazyinit::LazyInit;
use std::time::Duration;
const N: usize = 16;
static VALUE: LazyInit<usize> = LazyInit::new();
let threads = (0..N)
.map(|i| {
std::thread::spawn(move || {
std::thread::sleep(Duration::from_millis(10));
VALUE.call_once(|| i)
})
})
.collect::<Vec<_>>();
let mut ok = 0;
for (i, thread) in threads.into_iter().enumerate() {
if thread.join().unwrap().is_some() {
ok += 1;
assert_eq!(*VALUE, i);
}
}
assert_eq!(ok, 1);