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

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 ) ,?

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

什么是BlockExpressionThe reference基本上将其定义为两个大括号{ },其中包含一系列语句和一个可选的尾部表达式.

所以:commas at the end of match arms are optional if:

  • it is the last match arm, or
  • if the right hand side of the arm is a block expression (stuff between two braces 100).

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

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

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


至于what is idiomatic人:

  • 如果右侧以右括号}结尾,则省略逗号.
  • 如果不是:使用逗号,即使它是最后一根火柴.

Rust相关问答推荐

当Option为None时,Option数组是否占用Rust中的内存?

无法在线程之间安全地发送future (&Q;)&错误

抽象RUST中的可变/不可变引用

在决定使用std::Sync::Mutex还是使用Tokio::Sync::Mutex时,操作系统线程调度是考虑因素吗?

有没有办法指定只在Rust的测试中有效的断言?

如何使用Actix Web for Rust高效地为大文件服务

为什么 `Deref` 没有在 `Cell` 上实现?

为什么 GAT、生命周期和异步的这种组合需要 `T: 'static`?

借来的价值生命周期 不够长,不确定为什么它仍然是借来的

将泛型中的 Box 转换为 rust 中的 Box

Rust中的标记特征是什么?

由特征键控的不同 struct 的集合

Rust:`sort_by` 多个条件,冗长的模式匹配

Rust/Serde/HTTP:序列化`Option`

为什么在 macOS / iOS 上切换 WiFi 网络时 reqwest 响应会挂起?

为什么在 rust 中删除 vec 之前应该删除元素

为什么拥有 i32 所有权的函数需要它是可变的?

使用 HashMap 条目时如何避免字符串键的短暂克隆?

`map` 调用在这里有什么用吗?

如何迭代调用可能会失败的函数?操作员?