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

Ars*_*min 5 syntax idioms rust

在代码块可以以逗号结束或不以逗号结束时,Rust中存在许多情况.例如:

enum WithoutComma 
{
    x,
    y
}
Run Code Online (Sandbox Code Playgroud)

要么

enum WithComma
{
    x,
    y,
}
Run Code Online (Sandbox Code Playgroud)

还有其他"匹配"等的例子.似乎两种变体都会产生相同的结果.现在我知道放置或删除逗号更改行为的唯一情况,它是1元素元组声明(但它不是块):

let just_int = (5);
let tuple = (5,);
Run Code Online (Sandbox Code Playgroud)

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

huo*_*uon 12

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

  • 它使宏变得更容易:不需要小心不要在一系列项目的最后插入逗号.
  • 在扩展事物列表时,它会使差异更好,例如添加变量

    enum Foo {
        Bar
    }
    
    Run Code Online (Sandbox Code Playgroud)

    enum Foo {
        Bar,
        Baz
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这是改变两条线(即工具git将显示Bar修改后的线,以及插入的线),即使只有第二条实际上在更改中有任何有趣的东西.如果Bar以尾随逗号开头,那么Baz,在它之后插入就可以了,只更改了一行.

它们不是必需的(除了1元组),因为这是相当奇怪的(IMO),例如

fn foo(x: u16,) -> (u8, u8,) {
    (bar(x,), baz(x,),)
}
Run Code Online (Sandbox Code Playgroud)

(我想对enum/ struct声明看起来不那么奇怪,但是,能够省略它真的很好.)