Rust 为什么对弱者没有自动解引用<;T>;?

Rust 为什么对弱者没有自动解引用<;T>;?,rust,Rust,报告说: Rc自动取消对T的引用(通过Dereftrait) 而且 弱不会自动取消对T的引用,因为内部值可能已被删除 因此,除了提供一个upgrade()弱指针返回选项的选项外,如果在标准库中有一个Deref实现,它返回选项,是否会引起任何问题 因此,除了提供一个选项来升级()弱指针返回选项>,如果标准库中在弱返回选项上有一个Deref实现,它会导致任何问题吗 如果您查看Deref的定义,您将看到: pub-trait-Deref{ 类型目标:?尺寸; fn deref(&self)->&sel

报告说:

Rc
自动取消对
T
的引用(通过
Deref
trait)

而且

不会自动取消对
T
的引用,因为内部值可能已被删除

因此,除了提供一个
upgrade()
弱指针返回
选项
的选项外,如果在标准库中有一个
Deref
实现,它返回
选项
,是否会引起任何问题

因此,除了提供一个选项来升级()弱指针返回选项>,如果标准库中在弱返回选项上有一个Deref实现,它会导致任何问题吗

如果您查看Deref的定义,您将看到:

pub-trait-Deref{
类型目标:?尺寸;
fn deref(&self)->&self::Target;
}
因此,如果我们为
Weak
定义
type Target=Option
,我们必须返回一个
&Option
,这意味着我们必须返回一个位于别处的
选项的引用。这
无法做到,因为它没有
选项
居住在任何地方

这一想法还有其他问题:

  • 选项
    意味着
    选项
    拥有
    T
    ,这意味着我们必须将
    T
    中移出,这显然是无稽之谈(因为
    从定义上讲并不拥有它的项目)
  • 由于
    Rc
    之间没有静态关系,因此假设有可能将其下移到
    选项
    ,您可以通过降级Rc,获取引用,然后删除Rc来获得悬空指针:
    仍然存在,
    选项
    无法从您下方更改,所以你得到一个
    Some(&T)
    到一个
    T
    ,它已经被删除了

这就是为什么
upgrade
返回一个
Rc
,这确保了如果您在调用
upgrade
时仍然有一个活动的Rc,那么您现在可以独立地保持它的活动状态。

我认为这是不可能的。如果该函数存在,请想象以下代码:

let r: Rc<i32> = Rc::new(42);
let w: Weak<i32> = Rc::downgrade(&r);
let i: &i32 = w.unwrap(); //deref() -> Option<&i32>
drop(r);
let x: i32 = *i; //dangling reference, crash!!
让r:Rc=Rc::new(42);
设w:Weak=Rc::降级(&r);
设i:&i32=w.unwrap()//deref()->选项
下降(r);
设x:i32=*i//悬挂参考,崩溃!!
为了避免此问题,您需要在使用弱引用之前将其升级为正常引用。这在多线程场景中尤其重要(
Arc
在Rust中),因为
处于活动状态
检查基本上没有任何意义