gpt4 book ai didi

rust - 借用 Wea​​k

转载 作者:行者123 更新时间:2023-11-29 08:14:36 28 4
gpt4 key购买 nike

我觉得 rc::Weak可以使用(某种)AsRef特征实现。我试图从弱指针借用一些共享内容,但这不会编译:

use std::rc::Weak;

struct Thing<T>(Weak<T>);


impl<T> Thing<T> {
fn as_ref(&self) -> Option<&T> {
self.0.upgrade().map(|rc| {
rc.as_ref()
})
}

// For clarity, without a confusing closure
fn unwrapped_as_ref(&self) -> &T {
self.0.upgrade().unwrap().as_ref()
}
}

我明白为什么:升级后的Rc无法在 as_ref 中存活下来称呼。然而,在我看来,它是完美无缺的。使用 unsafe 的可能魔术编译:

impl<T> Thing<T> {
fn unwrapped_as_ref<'a>(&'a self) -> &'a T {
let rc = self.0.upgrade().unwrap();
unsafe {
std::mem::transmute(rc.as_ref())
}
}
}

所以:

  • 这个解决方案有什么缺点吗?好听吗?你能想到一个更简单的替代方案吗?
  • 实现 as_ref(&self) -> Option<&T> 是否有意义?在标准库中?

最佳答案

你不能从一个引用中借用,你就是不能。它很弱,它不能保证底层对象存在(这就是 upgrade() 返回 Option 的原因)。即使您很幸运并且该值在您通过弱引用访问它时仍然存在(upgrade() 返回 Some),它也可以在下一次被释放时刻,一旦 upgraded 引用超出范围。

为了获得对基础值的引用,您需要一些东西来保持它的活力(例如强引用),但这意味着您必须将它与引用一起返回。

关于rust - 借用 Wea​​k<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34821389/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com