use std::cell::UnsafeCell;
pub struct Global<T> {
v: UnsafeCell<Option<T>>,
f: Option<fn()-> T>
}
unsafe impl<T> Sync for Global<T> {}
impl<T> Global<T> {
pub const fn new(f:fn()->T)-> Global<T> { Global {
v: UnsafeCell::new(None),
f: Some(f)
}}
fn init_or_get(&self)->&T {
if let Some(v) = unsafe{self.v.get().as_ref().unwrap_unchecked()} {return v;};
let val = self.f.unwrap()();
unsafe {
*self.v.get() = Some(val);
}
self.init_or_get()
}
}
impl<T> std::ops::Deref for Global<T> {
type Target = T;
fn deref(&self) -> &T {
self.init_or_get()
}
}
使用
static Test:Global<u8> = Global::new(||2);
fn main() {
println!("{}",Test.pow(2));
}
预期输出:4
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于