为什么以及何时应该在块的末尾使用逗号?

Why and when should a comma be used at the end of a block?

在 Rust 中有很多情况下代码块可以以逗号或不以逗号结尾。 例如:

enum WithoutComma 
{
    x,
    y
}

enum WithComma
{
    x,
    y,
}

还有其他例子match,等等。似乎这两种变体导致相同的结果。我知道添加或删除逗号改变行为的唯一情况是 1 元素元组声明(不是块):

let just_int = (5);
let tuple = (5,);

为什么在一个块的末尾可以使用或不使用逗号?为什么语言中存在这种二元论,其原因是什么?

如您所说,唯一需要尾随逗号的是 1 元组模式、类型和构造 let (x,): (Type,) = (1,)。在其他任何地方,尾随逗号都是可选的,没有任何效果,但出于以下几个原因允许使用:

  • 它使宏更容易:无需注意不要在一系列项目的末尾插入逗号。
  • 它在扩展事物列表时使差异更好,例如添加变体

    enum Foo {
        Bar
    }
    

    给予

    enum Foo {
        Bar,
        Baz
    }
    

    正在更改两行(即像 git 这样的工具将显示已修改的 Bar 行,以及插入的行),即使实际上只有第二行在改变。如果 Bar 以逗号结尾,则在其后插入 Baz, 即可,仅更改一行。

它们不是必需的(1 元组除外),因为那会很奇怪(IMO),例如

fn foo(x: u16,) -> (u8, u8,) {
    (bar(x,), baz(x,),)
}

(我想 enum/struct 声明看起来不那么奇怪,但是,能够省略它仍然很好。)