首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向Weak<T>借款

向Weak<T>借款
EN

Stack Overflow用户
提问于 2016-01-15 23:07:14
回答 1查看 652关注 0票数 1

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

代码语言:javascript
复制
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进行编译的一个可能的魔术:

代码语言:javascript
复制
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>是否有意义?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-15 23:23:00

你不能借用弱引用,它是弱的,它不能保证底层对象存在(这就是为什么upgrade()返回一个Option)。即使幸运的是,在通过弱引用(upgrade()返回的Some)访问它的时候,值仍然是活动的,但一旦upgraded引用超出范围,就可以立即释放它。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34821389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档