用于分隔匹配表达式的两臂时,大括号和逗号有什么区别?

What is the difference between braces and commas when used to separate arms of a match expression?

我刚开始学习 Rust,有些事情让我感到困惑。

我读了这本书的第 2 章,编写一个猜谜游戏,代码的某些部分让我想知道什么是对的,什么是错的。

示例: 这是我在 another question:

中询问的一个循环
 loop {
    ...

    match guess.cmp(&secret_number) {
        Ordering::Less => println!("Too small!"),
        Ordering::Greater => println!("Too big!"),
        Ordering::Equal => {
            println!("You win!");
            break;
        }
    }
}

我意识到我可以这样写:

 match guess.cmp(&secret_number) {
    Ordering::Less => {
        println!("Too low!") // without semicolon ;
    } // without comma ,
    Ordering::Greater => {
        println!("Too high!")
    }
    Ordering::Equal => {
        println!("You win!!!");
        break;
    }
 }

我觉得这很混乱,我不知道它是好是坏,是否会导致未来的重大变化...... 谁能帮我理解一下?

如果使用大括号,匹配臂末尾的逗号是可选的。 rust parser/tokenizer 可以明确地解析带或不带逗号的匹配臂。 Look here:逗号是可选的。

任何以分号结尾的语句都没有 return 任何值(期望 return <>; 语句)。

第一种情况,

Ordering::Less => println!("Too small!"),

// Returns a unit value 

在第二种有大括号的情况下,没有分号的最后一行将被 returned。在这种情况下,它是 unit value.

看这个例子:

   let flag = false; 

   let result = match flag {
        false => {
            println!("in false arm");
            100
        },
        true => {
            println!("In true arm");
            200
        }
   };
   println!("result = {}", result);

这将打印以下内容:

in false arm
result = 100

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=f4a531293d9fc82459da0c3fbcf0e93d