Rust 向弱者借钱<;T>;

Rust 向弱者借钱<;T>;,rust,Rust,我觉得rc::Weak可以使用(某种)AsReftrait实现。我试图从弱指针借用一些共享内容,但无法编译: 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()

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

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()
  }
}
因此:

  • 这个解决方案有什么缺点吗?声音好吗?你能想出一个更简单的选择吗
  • 在标准库中实现
    as_ref(&self)->选项
    有意义吗
    • 你不能从一个弱的推荐人那里借钱,你就是不能。它很弱,不能保证底层对象存在(这就是为什么
      upgrade()
      返回
      选项的原因)。即使您很幸运,并且在通过弱引用(
      upgrade()
      返回
      Some
      )访问该值时,该值仍处于活动状态,但只要
      upgrade
      d引用超出范围,它就可以在下一刻被释放


      为了获得对基础值的引用,您需要一些能够使其保持活动状态的内容(例如强引用),但这意味着您必须将其与引用一起返回。

      我可能遗漏了一些重要的内容,但在我看来,这不可能是合理的。一旦你的
      As_ref
      函数退出,升级的引用就会被破坏,因此不能保证数据不会被释放,你就不能有对它的引用。你的答案基本上是正确的,但是(可能)会将
      弱的
      转换成
      Rc
      ,所以OP不会试图“借用弱指针”.@Shepmaster据我所知,OP最终试图做的是从一个弱引用中借用。作为中间步骤,它(可能)被转换为
      Rc
      ,但这不可能有帮助,除非我看不到明显的东西。看起来我最终试图从一个弱引用中借用。我想我需要做的是像
      as_ref(&self)->ThingRef
      这样的事情,我返回一个包装类型,比如
      ThingRef(Rc)
      implementing
      AsRef
      @rvidal
      Rc
      implements
      Deref
      AsRef
      ,所以也许你只想返回它?实际上,只需返回
      Rc
      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())
          }
        }
      }