使用 match 匹配双字母模式

Use match to match double letter pattern

我正在迭代一个字符向量。我想检测特定的字符序列(“ab”、“cd”、“pq”和“xy”)。如果我找到其中之一,我想 return false。但是,如果我找到一个双字母序列(例如:“aa”),我想 return true.

我想到了这个:

let chars: Vec<char> = line.chars().collect();

for (idx, c) in chars.iter().enumerate() {
    if idx > 0 {
        match (chars[idx - 1], c) {
            ('a', 'b') => return false,
            ('c', 'd') => return false,
            ('p', 'q') => return false,
            ('x', 'y') => return false,
            (c, c) => return true,
            _ => (),
        };
    }

但是,当我 运行 这样做时,出现以下错误:

36 |                 (c, c) => return true,
   |                     ^ used in a pattern more than once

我不明白为什么。

运行ning rustc --explain E0416好像给出了解决办法:

match (chars[idx - 1], c) {
            ('a', 'b') => return false,
            ('c', 'd') => return false,
            ('p', 'q') => return false,
            ('x', 'y') => return false,
            (prev, curr) if &prev == curr => return true,
            _ => (),
        };

但我想了解这里发生了什么。我原以为 (c, c).

会进行相等性检查

来自documentation

To create a match expression that compares the values of the outer x and y, rather than introducing a shadowed variable, we would need to use a match guard conditional

这里匹配模式需要一个字面量,或者新变量的声明,不能随便放一个动态值来比较。

可以使用编译器给出的方案,或者更直接的

      (a, _) if a==*c => return true,

请注意,这里有一些方法可以避免收集到向量中。例如,您可以将先前的值存储在 char 类型的可变变量中(如果您知道字符串不为空,则通过在循环之前获取第一个值)或存储到 Option<char>.