为什么这段代码有效?匹配语句中的逗号只是一个约定吗?
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])
}
}
Run Code Online (Sandbox Code Playgroud)
Luk*_*odt 17
让我们来看看Rust参考文献中的内容:
Run Code Online (Sandbox Code Playgroud)MatchArms : ( MatchArm => ( BlockExpression ,? | Expression , ) )* MatchArm => ( BlockExpression | Expression ) ,?
我们在这里看到的是,在右侧=>总是有一个表达式,但我们区分两种类型的表达式:BlockExpression和Expression.在BlockExpression之后,逗号是可选的(由表示?),但在正常表达式之后,除了最后一个匹配臂之外,需要逗号:在那里,逗号始终是可选的.
什么是BlockExpression?该引用将其定义为基本上两个括号{ },其中包含语句列表和可选尾部表达式.
所以:匹配武器末端的逗号是可选的,如果:
{}).不幸的是,编译器并不完全同意该引用.这有效,例如:
match true {
false => if true {
"hi"
} else {
"no"
}
true => ""
};
Run Code Online (Sandbox Code Playgroud)
请注意,第一个匹配臂的右侧不是块表达式,而是if-else-expression.因此,对于编译器,规则似乎是:如果右侧以右括号结束},则逗号是可选的.
至于什么是惯用语:
},请省略逗号.Rust匹配语句需要逗号吗?
不,你自己的代码证明了这一点.
为什么这段代码有效?
因为语言的设计者决定它应该.
甲匹配臂可以有后跟逗号或不具有逗号的块的表达式.
匹配语句中的逗号只是一个约定吗?
不可以.使用大括号时,rustfmt会删除逗号.否则他们是必需的.
rustfmt如何放置您的代码:
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])
}
}
}
Run Code Online (Sandbox Code Playgroud)