2 个稳定版本

1.1.0 2021年11月29日
1.0.0 2020年8月3日

#104内存管理

Download history 4567/week @ 2024-03-14 4636/week @ 2024-03-21 4191/week @ 2024-03-28 3751/week @ 2024-04-04 3709/week @ 2024-04-11 3962/week @ 2024-04-18 4186/week @ 2024-04-25 6136/week @ 2024-05-02 6508/week @ 2024-05-09 6344/week @ 2024-05-16 5536/week @ 2024-05-23 5556/week @ 2024-05-30 13635/week @ 2024-06-06 23553/week @ 2024-06-13 20079/week @ 2024-06-20 17812/week @ 2024-06-27

75,915 每月下载量
用于 47 个 Crates(12 个直接使用)

MIT 许可证

10KB
96

Crates.io Documentation

pin-weak

这个 crate 为 Pin<std::rc::Rc<T>>Pin<std::rc::Arc<T>> 提供了弱引用

动机

Pin<std::rc::Rc<T>>Pin<std::rc::Arc<T>> 如果 T 没有实现 Unpin,则不能安全地转换为它们的 Weak 等效物。这是因为如果这样做,就会发生类似以下情况:

struct SomeStruct(PhantomPinned);
let pinned = Rc::pin(SomeStruct(PhantomPinned));

// This is unsafe ...
let weak = unsafe {
    Rc::downgrade(&Pin::into_inner_unchecked(pinned.clone()))
};

// ... because otherwise it would be possible to move the content of pinned:
let mut unpinned_rc = weak.upgrade().unwrap();
std::mem::drop((pinned, weak));
// unpinned_rc is now the only reference so this will work:
let x = std::mem::replace(
    Rc::get_mut(&mut unpinned_rc).unwrap(),
    SomeStruct(PhantomPinned),
);

在这个例子中,x 是原始的 SomeStruct,我们将其移动到内存中,这是未定义的行为,请不要这样做。

PinWeak

这个 crate 简单地提供 rc::PinWeaksync::PinWeak,允许从 Pin<std::rc::Rc>Pin<srd::sync::Arc> 获取弱引用。

这是安全的,因为在尝试升级弱引用时,只能从其中获取一个 Pin

PinWeak 可以使用 PinWeak 降级函数创建。

示例

use pin_weak::rc::*;
struct SomeStruct(PhantomPinned, usize);
let pinned = Rc::pin(SomeStruct(PhantomPinned, 42));
let weak = PinWeak::downgrade(pinned.clone());
assert_eq!(weak.upgrade().unwrap().1, 42);
std::mem::drop(pinned);
assert!(weak.upgrade().is_none());

许可证

MIT

无运行时依赖

特性