2015-10-18 262 views
12

我明白&是如何工作的,但是與ref有什麼區別?它們可以互換嗎?`&`和`ref`有什麼區別?

我發現的唯一信息(因爲在Google上搜索符號效果不佳)是this page on Rust By Example,但它不能解釋兩者之間的區別。 The Book沒有太多的信息,ref僅在Patterns一章中列出。但是,ref似乎也在這種情況下使用。

那麼,ref有什麼用,和&有什麼區別?

+0

*非常相關,但不完全重複,因爲它不是'ref'和'&'之間的比較:http://stackoverflow.com/questions/27911656/rust-by-example-the-ref-模式 – Kroltan

回答

12

ref用於模式以將引用綁定到左值(左值是一個值,您可以採取的地址或多或少)。

重要的是要明白模式從正常表達式向後「倒退」,因爲它們已用於解析值

下面是一個簡單的例子。假設我們有這樣的:

let value = 42; 

我們可以通過兩種方式結合value參考:

let reference1 = &value; 
let ref reference2 = value; 

在第一種情況下,我們使用&作爲一個經營者採取的value地址。在第二種情況下,我們使用ref模式來「解構」左值。在這兩種情況下,變量的類型是&i32

&也可以在模式中使用,但它會做相反的事情:它通過取消引用來解構引用。假設我們有:

let value = 42; 
let reference = &value; 

我們可以用兩種反引用reference方式:

let deref1 = *reference; 
let &deref2 = reference; 

這裏,既deref1deref2i32類型。

但是,並不總是可以用兩種方式編寫相同的表達式,如下所示。例如,您不能使用&來引用存儲在枚舉變體中的值:您需要匹配它。例如,如果你想利用在Some的價值基準,你需要寫:

match option { 
    Some(ref value) => { /* stuff */ } 
    None => { /* stuff */ } 
} 

因爲有魯斯特沒有辦法,你可以使用&運營商,否則訪問值。

+0

謝謝,像fn blah(ref a:i32){}'這樣的定義相當於'fn blah(a:&i32)',它們何時都可以表達? – Kroltan

+4

@Kroltan不,他們不相同。函數參數中的模式(即':'左邊的任何東西)純粹是一個實現細節,調用者只能看到類型(即':'右邊的東西)。第一種情況相當於'fn blah(tmp:i32){let ref a = tmp; ''。第一個被稱爲'blah(0)',而第二個被稱爲'blah(&1)'。當然,在這兩種情況下,函數本身,'a'的類型都是'&i32',它只是外部接口的不同。 – huon

+0

@ huon-dbaupp,這是否意味着ref變體會先複製/移動該值? – Kroltan