有没有办法区分同一价值的不同种族?

问题描述 投票:3回答:2

这是一个例子:

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_*指针?

rust identity smart-pointers reference-counting
2个回答
5
投票

您可以将&*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

6
投票

和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

简而言之,您需要引用相等,而不是值相等。原始指针的值是内存地址,因此比较原始指针的值等同于引用相等性。

也可以看看:

© www.soinside.com 2019 - 2024. All rights reserved.