我明白&
是如何工作的,但是與ref
有什麼區別?它們可以互換嗎?`&`和`ref`有什麼區別?
我發現的唯一信息(因爲在Google上搜索符號效果不佳)是this page on Rust By Example,但它不能解釋兩者之間的區別。 The Book沒有太多的信息,ref
僅在Patterns一章中列出。但是,ref
似乎也在這種情況下使用。
那麼,ref
有什麼用,和&
有什麼區別?
我明白&
是如何工作的,但是與ref
有什麼區別?它們可以互換嗎?`&`和`ref`有什麼區別?
我發現的唯一信息(因爲在Google上搜索符號效果不佳)是this page on Rust By Example,但它不能解釋兩者之間的區別。 The Book沒有太多的信息,ref
僅在Patterns一章中列出。但是,ref
似乎也在這種情況下使用。
那麼,ref
有什麼用,和&
有什麼區別?
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;
這裏,既deref1
和deref2
是i32
類型。
但是,並不總是可以用兩種方式編寫相同的表達式,如下所示。例如,您不能使用&
來引用存儲在枚舉變體中的值:您需要匹配它。例如,如果你想利用在Some
的價值基準,你需要寫:
match option {
Some(ref value) => { /* stuff */ }
None => { /* stuff */ }
}
因爲有魯斯特沒有辦法,你可以使用&
運營商,否則訪問值。
謝謝,像fn blah(ref a:i32){}'這樣的定義相當於'fn blah(a:&i32)',它們何時都可以表達? – Kroltan
@Kroltan不,他們不相同。函數參數中的模式(即':'左邊的任何東西)純粹是一個實現細節,調用者只能看到類型(即':'右邊的東西)。第一種情況相當於'fn blah(tmp:i32){let ref a = tmp; ''。第一個被稱爲'blah(0)',而第二個被稱爲'blah(&1)'。當然,在這兩種情況下,函數本身,'a'的類型都是'&i32',它只是外部接口的不同。 – huon
@ huon-dbaupp,這是否意味着ref變體會先複製/移動該值? – Kroltan
*非常相關,但不完全重複,因爲它不是'ref'和'&'之間的比較:http://stackoverflow.com/questions/27911656/rust-by-example-the-ref-模式 – Kroltan