#rc #arc #pointers #weak #value #inner #wrapper

re-init-rc

为Rc和Arc弱指针提供包装,当访问时自动重新初始化内部值(如果它已经被丢弃)

1 个不稳定版本

0.1.0 2023年1月23日

#13#inner

MIT 许可协议

4KB
50

re-init-rc

该crate为Rc和Arc弱指针提供两个包装器 - ReInitRcReInitArc,这两个类型都提供了API来从内部弱指针(升级)获取指针(RcArc)或使用提供的函数重新创建值(如果内部弱指针指向已丢弃的值)。

API如下

impl ReInitRc<T, F: FnMut() -> T> {
    fn new(init_fn: F) -> Self { ... }
    fn get(&mut self) -> Rc<T> { ... }
}

对于ReInitArc也是一样的,但ReInitArc::get返回Arc<T>

使用ReInitRc的示例(ReInitArc的工作方式相同)

代码

use re_init_rc::ReInitRc;

struct PrintOnDrop;

impl Drop for PrintOnDrop {
    fn drop(&mut self) {
        println!("Printing on drop")
    }
}

fn main() {
    let mut x = ReInitRc::new(|| {
        println!("Initializing new PrintOnDrop...");
        PrintOnDrop
    });
    let x1 = x.get(); // Initializing new PrintOnDrop...
    let x2 = x.get();
    drop(x1);
    drop(x2); // Printing on drop
    let x3 = x.get(); // Initializing new PrintOnDrop...
    // As `x3` is just a `Rc<PrintOnDrop>` we can also clone it
    let x4 = x3.clone();
    drop(x3);
    drop(x4); // Print on drop
}

输出

Initializing new PrintOnDrop...
Printing on drop
Initializing new PrintOnDrop...
Printing on drop

无运行时依赖