匹配在传染媒介的铁锈样式

ash*_*ash 12 vector pattern-matching rust rust-obsolete

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

所以,看一个粗略的翻译,能够这样做会很高兴:

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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:我知道你可以在这里使用if语句,我只是将它作为矢量模式匹配的一个例子.

目前返回:

patterns.rs:10:4: 10:5 error: constant contains unimplemented expression type
patterns.rs:10     [] { ret initValue; }
                ^
error: aborting due to previous errors
Run Code Online (Sandbox Code Playgroud)

在教程中有一个示例用于解构结构(定义为{ .. })和元组(定义( .. )),所以看起来应该有内置的向量支持,同时考虑到它们还包含一个特殊的语法(定义[ .. ]).

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

str*_*lep 16

你需要切片模式

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

  • 如果不指定 `T: Copy`,则需要添加引用:`match &amp;vals[..]`。如果没有“&amp;”,您将尝试将非复制切片“vals[..]”移动到匹配项中。(你不需要参考比赛中的模式;我假设发生了自动取消引用切换。) (5认同)
  • 切片模式是如何组成的?例如匹配 Option&lt;Vec&lt;Vec&lt;u8&gt;&gt;&gt; ? (2认同)

B. *_*gel 7

我希望我可以给上向量如何最好地使用模式匹配更一般的建议,但这里是你如何使用它们来测试空载体(至少我认为这是什么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" }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,尝试简单地[]作为参数传递失败,因为编译器无法推断向量的类型.这似乎是可能通过[()](与载体nil内)没有先声明,但该alt声明似乎无法测试,看看是否头则表达式匹配[()](它只是落空至默认值).

总而言之,向量似乎有点粗糙.如果有一些具体的使用你心里有锈似乎不支持,开发商都建议和critcism相当开放:https://mail.mozilla.org/listinfo/rust-dev

另请参阅参考手册以获得更正式的定义,并参阅更多示例以帮助澄清事项:http://doc.rust-lang.org/doc/rust.html#alternative-expressions

  • 我认为目前最终不支持这一点.我提交了[RFC来扩展解构以支持向量](https://github.com/mozilla/rust/issues/1844).我在这个问题上有另一个例子,我认为有助于显示问题.无论如何,这将是一个很好的功能.希望在未来,这样的事情会起作用. (4认同)