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 :(得分: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
语句似乎无法测试以查看头部表达式是否匹配{{ 1}}(它只是默认)。
总而言之,向量似乎有点粗糙。如果有一些具体的用途,你会想到Rust似乎不支持,开发人员对建议和批评持开放态度:https://mail.mozilla.org/listinfo/rust-dev
另请参阅参考手册以获取更正式的定义,并参阅更多示例以帮助澄清事项:http://doc.rust-lang.org/doc/rust.html#alternative-expressions
答案 1 :(得分:1)
您需要这个https://doc.rust-lang.org/reference/patterns.html#slice-patterns
fn vec_alt<A>(vals: Vec<A>) -> str {
match vals[..] {
[] => { "empty" }
_ => { "otherwise" }
}
}