这是一个例子:
use std::rc::Rc;
#[derive(PartialEq, Eq)]
struct MyId;
pub fn main() {
let rc_a_0 = Rc::new(MyId);
let rc_a_1 = rc_a_0.clone();
let rc_b_0 = Rc::new(MyId);
let rc_b_1 = rc_b_0.clone();
println!("rc_a_0 == rc_a_1: {:?}", rc_a_0 == rc_a_1);
println!("rc_a_0 == rc_b_0: {:?}", rc_a_0 == rc_b_0);
}
两个println!
s上面打印true
。有没有办法区分rc_a_*
和rc_b_*
指针?
您可以将&*rc
强制转换为*const T
以获取指向基础数据的指针并比较这些指针的值:
use std::rc::Rc;
#[derive(PartialEq, Eq)]
struct MyId;
pub fn main() {
let rc_a_0 = Rc::new(MyId);
let rc_a_1 = rc_a_0.clone();
let rc_b_0 = Rc::new(MyId);
let rc_b_1 = rc_b_0.clone();
println!(
"rc_a_0 == rc_a_1: {:?}",
&*rc_a_0 as *const MyId == &*rc_a_1 as *const MyId
);
println!(
"rc_a_0 == rc_b_0: {:?}",
&*rc_a_0 as *const MyId == &*rc_b_0 as *const MyId
);
}
版画
rc_a_0 == rc_a_1: true
rc_a_0 == rc_b_0: false
和Dogbert一样的答案,但也许有点清洁:
use std::ptr;
println!(
"rc_a_0 == rc_a_1: {:?}",
ptr::eq(rc_a_0.as_ref(), rc_a_1.as_ref())
);
println!(
"rc_a_0 == rc_b_0: {:?}",
ptr::eq(rc_a_0.as_ref(), rc_b_0.as_ref())
);
rc_a_0 == rc_a_1: true
rc_a_0 == rc_b_0: false
简而言之,您需要引用相等,而不是值相等。原始指针的值是内存地址,因此比较原始指针的值等同于引用相等性。
也可以看看: