2016-06-08 29 views
3

下面是一個例子:有沒有辦法在同一個值的不同'Rc'之間進行distingush?

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上面打印true。 有沒有辦法區分rc_a_*rc_b_*指針?

回答

4

你可以施放&*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 
5

相同的答案爲Dogbert,但也許有點清潔:

println!("rc_a_0 == rc_a_1: {:?}", rc_a_0.as_ref() as *const _ == rc_a_1.as_ref() as *const _);       
println!("rc_a_0 == rc_b_0: {:?}", rc_a_0.as_ref() as *const _ == rc_b_0.as_ref() as *const _); 

總之,你想要引用等於,而不是值相等。原始指針的值是內存地址,因此比較原始指針的值等於引用相等。

相關問題