Rust匹配语句需要逗号吗?

Dun*_*can 12 syntax rust

为什么这段代码有效?匹配语句中的逗号只是一个约定吗?

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参考文献中的内容:

MatchArms :
   ( MatchArm => ( BlockExpression ,? | Expression , ) )*
   MatchArm => ( BlockExpression | Expression ) ,?
Run Code Online (Sandbox Code Playgroud)

我们在这里看到的是,在右侧=>总是有一个表达式,但我们区分两种类型的表达式:BlockExpressionExpression.在BlockExpression之后,逗号是可选的(由表示?),但在正常表达式之后,除了最后一个匹配臂之外,需要逗号:在那里,逗号始终是可选的.

什么是BlockExpression该引用将其定义为基本上两个括号{ },其中包含语句列表和可选尾部表达式.

所以:匹配武器末端的逗号是可选的,如果:

  • 这是最后一场比赛,或者
  • 如果手臂的右侧是块表达式(两个大括号之间的东西{}).

不幸的是,编译器并不完全同意该引用.这有效,例如:

match true {
    false => if true {
        "hi"
    } else {
        "no"
    }
    true => ""
};
Run Code Online (Sandbox Code Playgroud)

请注意,第一个匹配臂的右侧不是块表达式,而是if-else-expression.因此,对于编译器,规则似乎是:如果右侧以右括号结束},则逗号是可选的.


至于什么是惯用语:

  • 如果右侧以闭合支撑结束},请省略逗号.
  • 如果不是:使用逗号,即使它是最后一个匹配臂.


She*_*ter 7

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)