tutorial显示了一些非常基本的模式匹配示例,例如在整数上进行匹配以模拟c风格的switch语句.本教程还展示了如何对元组类型进行基本的解构,以及解构 struct .

似乎应该可以在向量上进行模式匹配,但我无法找到正确的语法,也没有找到任何例子.

例如,在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);
    }
  }
}

Note: I know you could use an if statement here, I am just using this as an example of pattern matching over a vector.

当前返回:

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

本教程中有一个分解 struct (用{ .. }定义)和元组(用( .. )定义)的示例,因此考虑到向量还包含特殊语法(用[ .. ]定义),似乎还应该内置对向量的支持.

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

推荐答案

我希望我能就如何最好地使用向量上的模式匹配给出更一般的建议,但以下是如何使用它们来测试空向量(至少我知道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" }
    }
}

请注意,try 将[]作为参数传递失败,因为编译器无法推断向量的类型.似乎可以在不首先声明的情况下通过[()](一个内部带有nil的向量),但alt语句似乎无法测试head表达式是否与[()]匹配(它只是默认值).

总而言之,向量目前似乎有点粗糙.如果你认为Rust似乎不支持某些特定用途,开发人员会非常乐意接受建议和批评:https://mail.mozilla.org/listinfo/rust-dev

另请参阅参考手册,了解更正式的定义,以及更多有助于澄清问题的示例:http://doc.rust-lang.org/doc/rust.html#alternative-expressions

Rust相关问答推荐

如何对字符串引用的引用向量进行排序,而不是对最外层的引用进行排序?

为什么复印是豆荚的一个重要特征?

什么是Rust惯用的方式来使特征向量具有单个向量项的别名?

Box::new()会从一个堆栈复制到另一个堆吗?

防止cargo test 中的竞争条件

铁 rust 中的共享对象实现特征

有没有一种惯用的方法来判断VEC中是否存在变体?

使用Py03从Rust调用Python函数时的最佳返回类型

在生存期内将非静态可变引用转换为范围内的静态可变引用

如何在不调用Collect()的情况下为新型vec实现IntoIterator?

如何在嵌套的泛型 struct 中调用泛型方法?

为什么rustc会自动降级其版本?

确保参数是编译时定义的字符串文字

.to_owned()、.clone() 和取消引用 (*) 之间有区别吗?

`use` 和 `crate` 关键字在 Rust 项目中效果不佳

如何使用 Rust Governor 为每 10 秒 10 个请求创建一个 RateLimiter?

如何使用泛型满足 tokio 异步任务中的生命周期界限

使用 traits 时,borrow 的值不会存在足够长的时间

将 Futures 的生命周期特征绑定到 fn 参数

如何在 nom 中构建负前瞻解析器?