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

Posted

技术标签:

【中文标题】为啥以及何时应该在块的末尾使用逗号?【英文标题】:Why and when should a comma be used at the end of a block?为什么以及何时应该在块的末尾使用逗号? 【发布时间】:2015-03-25 16:07:25 【问题描述】:

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

enum WithoutComma 

    x,
    y

enum WithComma

    x,
    y,

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

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

为什么在一个块的末尾可以使用逗号?为什么语言会出现这样的二元性,原因是什么?

【问题讨论】:

【参考方案1】:

正如您所说,唯一需要尾随逗号的是 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 声明看起来不那么奇怪,但仍然可以省略它。)

【讨论】:

在 C++ 之后,语言中的任何添加或语法糖只有在大量死尸的出现表明其重要性时才会发生,我很难相信 Rust 中这种带逗号的二元论的原因只是更容易宏观和差异。不过看来你是对的。

以上是关于为啥以及何时应该在块的末尾使用逗号?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们需要复制构造函数以及何时应该在 java 中使用复制构造函数

何时以及为啥要使用 Java 同步? [复制]

为啥以及何时使用 Django mark_safe() 函数

何时/为啥不应该在我的 DataContracts 上使用 IsReference=true?

为啥要使用 SerializeField?

为啥以及何时使用重组分支?