1 个不稳定版本
0.1.0 | 2023年1月23日 |
---|
#13 在 #inner
4KB
50 行
re-init-rc
该crate为Rc和Arc弱指针提供两个包装器 - ReInitRc
和 ReInitArc
,这两个类型都提供了API来从内部弱指针(升级)获取指针(Rc
或 Arc
)或使用提供的函数重新创建值(如果内部弱指针指向已丢弃的值)。
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