syntax - Rust 匹配语句需要逗号吗?

标签 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])
                 }
}

最佳答案

让我们看看是什么the Rust reference says about this :

MatchArms :
   ( MatchArm => ( BlockExpression ,? | Expression , ) )*
   MatchArm => ( BlockExpression | Expression ) ,?

这里我们可以看到在=>的右边总是有一个表达式,但是我们区分两种类型的表达式:BlockExpression表达。在 BlockExpression 之后,逗号是可选的(由 ? 表示),但在普通表达式之后,逗号是必需的,除了最后一个匹配臂:在那里,逗号是总是可选的。

什么是BlockExpressionThe reference基本上将其定义为两个大括号 { } 以及一个语句列表和一个可选的尾部表达式。

因此:如果出现以下情况,匹配臂末尾的逗号是可选的:

  • 是最后一个匹配臂或者
  • 如果 ARM 的右侧是 block 表达式(两个大括号 {} 之间的内容)。

不幸的是,编译器不太同意该引用。这有效,例如:

match true {
    false => if true {
        "hi"
    } else {
        "no"
    }
    true => ""
};

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


至于什么是地道的:

  • 如果右侧以右大括号 结尾,请省略逗号。
  • 如果不是:使用逗号,即使它是最后一个匹配臂。

关于syntax - Rust 匹配语句需要逗号吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51662829/

相关文章:

sql - 嵌套,分组Sqlite语法?

php - 一行代码从返回数组的函数中获取一个值

python - 与Python子进程通信

rust - 什么时候需要使用生命周期?

hashmap - 在两个 HashMap 之间交换值

regex - 是否可以更改 emacs 的正则表达式语法?

sql - 插入子句 SQL 并且不指定最后一个属性

sql - SQL语法错误以外部方式创建过程

generics - rust:巨大的通用构造函数,嵌套特征

string - Rust 中的 r #""# 运算符是什么?