Rust 为什么指向同一分配的两个引用计数器不相等?
我最近在以下方面遇到了这种情况:Rust 为什么指向同一分配的两个引用计数器不相等?,rust,Rust,我最近在以下方面遇到了这种情况: 根据定义,指向内存中相同位置的两个指针肯定是相等的(因为它们是相同的值)?如果两个值仅为PartialEq而不是Eq?的话,为什么会出现这种情况呢?因为并非所有的值都等于它们自己NaN。Rust的指针比较不比较指针,而是比较指向的值。这是&T,&mut T,框,Rc,弧等的情况,除了原始指针*const T和*mut本身之外,其他所有指针都是这样。这些智能指针通常有一个额外的方法(在本例中)用于实际指针比较 这类似于那些指针上的Debug如何打印指向的值而不是地
根据定义,指向内存中相同位置的两个指针肯定是相等的(因为它们是相同的值)?如果两个值仅为
PartialEq
而不是Eq
?的话,为什么会出现这种情况呢?因为并非所有的值都等于它们自己<例如,code>NaN。Rust的指针比较不比较指针,而是比较指向的值。这是&T
,&mut T
,框
,Rc
,弧
等的情况,除了原始指针*const T
和*mut
本身之外,其他所有指针都是这样。这些智能指针通常有一个额外的方法(在本例中)用于实际指针比较
这类似于那些指针上的Debug
如何打印指向的值而不是地址,并且您需要指针
特性来打印实际地址:Rust不是非常关注地址
现在,如果您有一个类型,如f64
,它没有可传递的=
(即,它实现PartialEq
,但不实现Eq
),并将其包装在Rc
中,那么您也会得到非可传递性:
fn main(){
设a=std::rc::rc::new(std::f64::NAN);
println!(“a==a?:{},a==a);
普林顿(
“a==a但具有指针比较?:{}”,
标准::rc::rc::ptr_eq(&a,&a)
);
//但是:
让答案=std::rc::rc::new(42);
//这肯定会有不同的地址
让另一个答案=std::rc::rc::new(42);
println!(“答案==另一个答案:{}”,答案==另一个答案);
}
印刷品:
a==a?:false
a==a但有指针比较?:true
答案==另一个答案?:正确
如果T
碰巧实现了Eq
以及PartialEq
,那么当前的实现确实会使用尚未稳定的专门化功能进行指针比较
另见:
/// If `T` also implements `Eq` (implying reflexivity of equality),
/// two `Rc`s that point to the same allocation are
/// never unequal.