4个版本
0.1.3 | 2023年1月27日 |
---|---|
0.1.2 | 2023年1月25日 |
0.1.1 | 2023年1月25日 |
0.1.0 | 2023年1月24日 |
#82 in #initialization
每月下载量30次
用于 mtcp-rs
27KB
346 行代码(不包括注释)
lazy_rc – 懒Rc和Arc
lazy_rc提供了Rc<T>
和Arc<T>
的懒初始化实现。
Crates.io
https://crates.io/crates/lazy_rc
lib.rs
:
lazy_rc提供了Rc<T>
和Arc<T>
的懒初始化实现。
换句话说,当第一次访问时,LazyRc
线程安全
LazyRc<T>
是单线程的,因为RcLazyRc<T>
用于static
变量。然而,它可以用于thread_local!
变量。
LazyArc<T>
是 线程安全的,因为 Arc<T>
也是线程安全的。因此,LazyArc<T>
实例可以被多个线程共享,甚至可以使用 LazyArc<T>
作为 全局 静态
变量。
常量警告
请不要将 LazyRc<T>
或 LazyArc<T>
作为 常量
值使用!这是因为,在 Rust 中,常量
值是“内联”的,实际上在每个使用 常量
值的地方创建了一个 新的 实例。这显然打破了“延迟”初始化 😨
示例
use lazy_rc::{LazyRc, LazyArc};
static GLOBAL_INSTANCE: LazyArc<MyStruct> = LazyArc::empty();
thread_local! {
static THREAD_INSTANCE: LazyRc<MyStruct> = LazyRc::empty();
}
struct MyStruct {
/* ... */
}
impl MyStruct {
fn new() -> Result<Self> {
/* ... */
}
/// Returns a thread-local instance that will be created on first access.
/// If the initialization function fails, then an Error will be returned.
pub fn instance() -> Result<Rc<Self>> {
THREAD_INSTANCE.with(|lazy| lazy.or_try_init_with(Self::new))
}
}