是否有一个内置的枚举可以包含Arc<T>
或Weak<T>
,类似于Cow<T>
可以包含一个拥有或借用的值?我已经使用过这种模式好几次了,我想知道我是否应该(内部)形式化我自己的枚举,或者它是否已经存在。
是否已经定义了类似于以下假 rust 的东西?
pub enum MaybeWeak<T> {
Strong(Arc<T>),
Weak(Weak<T>),
}
impl<T> MaybeWeak<T> {
pub fn try_deref(&self) -> Option<Arc<T>> {
match self {
Strong(a) => Some(a.clone()),
Weak(w) => w.upgrade(),
}
}
1条答案
按热度按时间5t7ly7z51#
是的,有。它叫
Weak
。Arc
(或Rc
)并不表示“拥有”价值(即Box
),而是一个共享值,你有一个共享引用。如果你不知道这个值是否存在,那就是Weak
所表示的。你的MaybeWeak
枚举没有多大意义。只要存储一个Weak
,然后在它上面调用upgrade
,当您想要访问该值时。另一方面,与使用点操作符调用它相比,更喜欢完全限定的表示法
Arc::clone(&ptr)
和Weak::upgrade(&ptr)
,以避免T
具有同名方法时可能出现的错误。