【问题标题】:Do Rust match statements require commas?Rust 匹配语句是否需要逗号?
【发布时间】:2018-08-02 22:13:00
【问题描述】:

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

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

【问题讨论】:

    标签: syntax rust


    【解决方案1】:

    我们来看看the Rust reference says about this

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

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

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

    所以:如果:

    ,匹配符末尾的逗号是可选的:
    • 这是最后一场比赛
    • 如果手臂的右侧是一个块表达式(两个大括号之间的东西 {})。

    不幸的是,编译器并不完全同意该参考。这有效,例如:

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

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


    至于什么是惯用语

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-05
        • 1970-01-01
        • 1970-01-01
        • 2018-01-01
        • 2017-02-03
        • 1970-01-01
        • 2014-06-01
        • 1970-01-01
        相关资源
        最近更新 更多