矢量上的 Rust 模式匹配

问题描述 投票:0回答:3

教程展示了一些非常基本的模式匹配示例,例如匹配整数以模拟 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

教程中有一个解构结构(用

{ .. }

定义)和元组(用
( .. )
定义)的示例,所以看起来应该有对向量的内置支持,考虑到它们还包含特殊语法(用 
[ .. ]
 定义)。

如果我也以错误的方式使用向量,请随时纠正我。

vector pattern-matching rust rust-obsolete
3个回答
49
投票
您需要

切片图案

fn vec_alt<T>(vals: Vec<T>) -> &'static str { match vals[..] { [a, b] => "two elements", [a, b, c] => "three elements", _ => "otherwise", } }
    

8
投票
我希望我可以就如何最好地在向量上使用模式匹配提供更一般的建议,但以下是如何使用它们来测试空向量(至少我

认为这就是 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


0
投票

match

 完整的矢量和 
guard
 匹配臂:

fn vec_alt<T>(vals: Vec<T>) -> &'static str { match vals { v if v.len() == 2 => "two elements", v if v.len() == 3 => "three elements", _ => "otherwise", } }

游乐场

© www.soinside.com 2019 - 2024. All rights reserved.