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

Crates.io Unlicense

lazy_rc提供了Rc<T>Arc<T>的懒初始化实现。

Crates.io
https://crates.io/crates/lazy_rc

API文档
https://docs.rs/lazy_rc/latest/index.html

示例
https://github.com/dEajL3kA/lazy_rc/tree/master/examples


lib.rs:

lazy_rc提供了Rc<T>Arc<T>初始化实现。

换句话说,当第一次访问时,LazyRc或LazyArc实例的“内部”值会使用提供的初始化函数创建。初始化可能失败,此时错误会传递通过。

线程安全

LazyRc<T>单线程的,因为Rc也是单线程的。因此,LazyRc实例不能被多个线程共享,你不能使用LazyRc<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))
    }
}

无运行时依赖