2016-04-07 2 views
2

Я пытаюсь понять, когда использовать ref и &, а также когда они взаимозаменяемы. В другом примере кода я использовал неправильное количество &, но, выполняя некоторые тесты, я видел, что это работает иногда. Возьмите этот код в качестве примера:Почему адрес переменной изменяется, когда я добавляю несколько '&'?

fn main() { 
    let test  = 5; 
    let ref testRef = test; 

    println!("&test    as *const _ {:?}", &test  as *const _); 
    println!("&testRef   as *const _ {:?}", &testRef as *const _); 
    println!("&*testRef   as *const _ {:?}", &*testRef as *const _); 

    println!("&&&&&&&&&&testRef as *const _ {:?}", &&&&&&&&&&testRef as *const _); 
    println!("&&&&&testRef  as *const _ {:?}", &&&&&testRef  as *const _); 
    println!("&&&&&&*testRef as *const _ {:?}", &&&&&&*testRef as *const _); 

    println!("&&&&&&&&&&testRef    {:?}", &&&&&&&&&&testRef); 
    println!("&&&&&testRef     {:?}", &&&&&testRef); 
    println!("&&&&&&*testRef    {:?}", &&&&&&*testRef); 
} 

Shell:

&test    as *const _ 0x7fffac2d5be4 <- this no problem I understand 
&testRef   as *const _ 0x7fffac2d5bd8 <- this no problem I understand 
&*testRef   as *const _ 0x7fffac2d5be4 <- this no problem I understand 

&&&&&&&&&&testRef as *const _ 0x7fffac2d5998 <- why this found and 
&&&&&testRef  as *const _ 0x7fffac2d58f0 <- It changes every 
&&&&&&*testRef as *const _ 0x7fffac2d5840 <- time you add & 

&&&&&&&&&&testRef    5 
&&&&&testRef     5 
&&&&&&*testRef    5 

ответ

6

При использовании оператора & на выражение, что это не просто путь к переменной, Ржавчина на самом деле создает временную неназванный переменную, присваивает ему результат выражения и дает ссылку на временную переменную. Так что если вы &&test, Rust создает временный (давайте назовем его tmp):

let tmp = &test; 

, а затем Rust дает &tmp, что, очевидно, имеет новую ячейку памяти.