为什么这段代码有效?匹配语句中的逗号只是一种约定吗?
for (index, character) in argv[1].chars().enumerate() {
match character {
'a' | 'A' => {println!("{}: 'A'", index)}
'e' | 'E' => {println!("{}: 'E'", index)}
'i' | 'I' => {println!("{}: 'I'", index)}
'o' | 'O' => {println!("{}: 'O'", index)}
'u' | 'U' => {println!("{}: 'U'", index)}
_ => {
let consonant: Vec<_> = character.to_uppercase().collect();
println!("{}: {:?} is not a vowel", index, consonant[0])
}
}
最佳答案
让我们看看是什么the Rust reference says about this :
MatchArms : ( MatchArm => ( BlockExpression ,? | Expression , ) )* MatchArm => ( BlockExpression | Expression ) ,?
这里我们可以看到在=>
的右边总是有一个表达式,但是我们区分两种类型的表达式:BlockExpression和表达。在 BlockExpression 之后,逗号是可选的(由 ?
表示),但在普通表达式之后,逗号是必需的,除了最后一个匹配臂:在那里,逗号是总是可选的。
什么是BlockExpression? The reference基本上将其定义为两个大括号 { }
以及一个语句列表和一个可选的尾部表达式。
因此:如果出现以下情况,匹配臂末尾的逗号是可选的:
- 是最后一个匹配臂,或者
- 如果 ARM 的右侧是 block 表达式(两个大括号
{}
之间的内容)。
不幸的是,编译器不太同意该引用。这有效,例如:
match true {
false => if true {
"hi"
} else {
"no"
}
true => ""
};
请注意,第一个匹配臂的右侧不是 block 表达式,而是 if-else-表达式。因此,对于编译器而言,规则似乎是:如果右侧以右大括号 }
结尾,则逗号是可选的。
至于什么是地道的:
- 如果右侧以右大括号
结尾,请省略逗号。
- 如果不是:使用逗号,即使它是最后一个匹配臂。
关于syntax - Rust 匹配语句需要逗号吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51662829/