使用 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)
.
会进行相等性检查
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>
.
我正在迭代一个字符向量。我想检测特定的字符序列(“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)
.
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>
.