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中),因为处于活动状态
检查基本上没有任何意义