2013-09-28 56 views
3

&variable在模式或閉包參數中使用時的含義是什麼?參數/模式中'&variable'的含義

for &code in self.exit_code.iter() { ... } 

let mut new_seps = do seps.iter().fold(~[]) |result, &next| { ... } 

在這裏,我們有for循環和封閉定義&code&next&是什麼意思?爲什麼我們不能簡單地使用codenext,沒有&符號?它與模式匹配中的ref限定符有關嗎?它是否與&self參數在特徵實現中相關?

我在current Rust reference manualtutorial中都找不到這種語法。目前我認爲這是某種隱含的解引用(如果我在模式中省略了&,則出現錯誤消息,但是我不確定)。

+0

我得說,借用的意思是「捕獲指針「而不是」按值「。 –

+0

@KerrekSB,這是否意味着如果在'|結果中,next |''next'具有類型'T',那麼在'| result,next |''next'具有'&T'類型? –

+0

我會這麼想,但我也不確定。正如你所說,手冊在這方面有點缺乏......但這應該很容易嘗試,但! –

回答

6

這是一種模式匹配,「解構」&T類型的東西。也就是說,在

let &x = &1i; 

x的類型爲int,和值1。所以它實際上是相反ref(它做什麼@KerrekSB是說,ref x捕獲通過引用而不是通過值)。

人們可以把它當作類似於

match returns_an_option() { 
    Some(a) => { ... } 
    None => { ... } 
} 

除外&T構造爲&,不SomeNone


在這種特定的情況下,我想seps是一個向量(錯誤你狀態表明它可能是一個&[&str]),所以.iter()返回實現Iterator<& &str>的對象,也就是說,它是在以引用的迭代器矢量元素(&str),因此,您需要取消next取消原始&str。這可以通過&在模式匹配中完成(如代碼演示)使用*next

(注意&模式只含蓄地可複製類型的工作,因爲一個人不能從參考移動所有權輸出/ 指針(即&T)。)

+0

是的,你完全正確。它是'&[&str]'矢量。我沒有注意到'iter()'返回的是'Iterator <&T>'而不是'Iterator ',因此混淆了。所以,它確實是某種隱含的解引用,並且它也很好地符合模式匹配語義,正如我懷疑的那樣。非常感謝你。 –