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
在解构结构(由{..}定义)和元组(用(..)定义)的教程中有一个例子,所以似乎应该内置对向量的支持,同时考虑到它们还包含一个特殊的语法(用[..]定义).
如果我以错误的方式使用向量,请随时纠正我.
解决方法
我希望我能够就如何最好地使用向量的模式匹配提供更多的一般性建议,但是这里是如何使用它们来测试空的向量(至少我认为这是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" } } }
请注意,尝试简单地将[]作为参数传递失败,因为编译器无法推断向量的类型.在没有首先声明它的情况下,似乎可以通过[()](一个没有内容的向量),但是alt语句似乎无法测试,以查看头部表达式是否匹配[()](它简单地落在默认).
总而言之,矢量似乎有点粗糙.如果有一些具体的使用方法,您可以考虑到Rust似乎并不支持,开发人员对于建议和批评是相当开放的:https://mail.mozilla.org/listinfo/rust-dev
另请参阅更为正式的定义的参考手册,还有更多的例子来帮助澄清事情:http://doc.rust-lang.org/doc/rust.html#alternative-expressions