2012-02-14 51 views
10

tutorial顯示了模式匹配的一些非常基本的示例,例如匹配整數以模擬c樣式的switch語句。本教程還演示瞭如何對元組類型進行基本解構和解構結構。與矢量匹配的生鏽模式

它似乎應該有可能模式匹配的矢量,但我找不出正確的語法,我沒有找到它的任何例子。

例如,在Haskell你可以輕鬆地解構列表:

foldr :: (a -> b -> b) -> b -> [a] -> b 
foldr func initValue []  = initValue 
foldr func initValue (x:xs) = func initValue $ foldr initValue func xs 

所以,看一個粗略的翻譯,這將是很好能夠做到:

fn foldr<A, B>(func: fn(A, B) -> B, 
       initValue: B, 
       vals: [A]) -> B { 
    alt vals { 
    [] { ret initValue; } 
    _ { 
     let h = vec::head(vals), 
      t = vec::tail(vals); 
     ret foldr(func, func(initValue, h), t); 
    } 
    } 
} 

注:我知道你可以在這裏使用if語句,我只是將它用作一個向量模式匹配的例子。

這個當前返回:

patterns.rs:10:4: 10:5 error: constant contains unimplemented expression type 
patterns.rs:10  [] { ret initValue; } 
       ^
error: aborting due to previous errors 

有教程的解構結構爲例(與{ .. }定義)和元組(與(..)定義),因此它似乎應該有內置的支持對於矢量也考慮到它們也包含一個特殊的語法(用[ .. ]定義)。

如果我以錯誤的方式使用矢量,請隨時糾正我。

+0

有點切線,但對於尾部呼叫,您應該使用「be」而不是「ret」。 – 2012-02-14 21:32:20

+0

@ ian-b有趣的是,[教程](http://doc.rust-lang.org/doc/tutorial.html)和[語言參考](http://doc.rust-lang.org/doc/ rust.html)似乎過時了,他們提到'是'作爲關鍵字,但他們目前並沒有提及它 – ash 2012-02-15 20:08:36

回答

6

我希望我可以給更多的一般意見如何在向量最好使用模式匹配,但這裏是你如何使用它們來測試空載體(至少我認爲就是這樣Haskell代碼是做什麼的.. 。):

use std; 
import std::io::println; 

fn main() { 
    let empty: [int] = []; 
    println(vec_alt(empty)); 
    println(vec_alt([1,2,3])); 
} 

fn vec_alt<A>(vals: [A]) -> str { 
    alt vals { 
     x if x == [] { "empty" } 
     _ { "otherwise" } 
    } 
} 

注意,試圖簡單地傳遞[]作爲參數,因爲編譯器不能推斷該載體的類型失敗。似乎有可能通過[()](一個帶有nil的矢量)而不先聲明它,但alt聲明似乎無法測試以查看頭表達式是否匹配[()](它簡單地落入缺省值)。

總而言之,載體看起來有點粗糙。如果您有一些具體用途,請牢記Rust似乎不支持,但開發人員對開發人員非常樂於接受建議和批評:https://mail.mozilla.org/listinfo/rust-dev

另請參閱參考手冊瞭解更多正式定義以及其他幾個示例有助於澄清事情:http://doc.rust-lang.org/doc/rust.html#alternative-expressions

+4

我認爲目前這還不被支持。我提交了一個[RFC來擴展解構以支持載體](https://github.com/mozilla/rust/issues/1844)。我認爲這個問題有另一個例子,我認爲這有助於展示這個問題。無論如何,這將是一個很好的功能。希望將來,像這樣的事情將會起作用。 – ash 2012-02-14 22:23:44

+0

現在有人正在處理這個問題:https://github.com/mozilla/rust/pull/4091 – LennyStackOverflow 2012-12-05 17:05:30