当代码块可以以逗号结束或不以逗号结束时,Rust中有很多情况。 例如:
enum WithoutComma
{
x,
y
}
或
enum WithComma
{
x,
y,
}
还有其他与"匹配"等的例子。似乎两种变体都会产生相同的结果。现在我知道唯一的情况是放置或删除逗号更改行为,它是1元素元组声明(但它不是块):
let just_int = (5);
let tuple = (5,);
问题是为什么在块的末尾可以使用逗号?为什么语言中存在这种二元论?它的原因是什么?
答案 0 :(得分:12)
正如您所说,唯一需要尾随逗号的是1元组模式,类型和构造let (x,): (Type,) = (1,)
。在其他地方,尾随逗号是可选的,没有效果,但是由于以下几个原因而允许:
在扩展一系列内容时会使差异变得更好,例如:添加变体
enum Foo {
Bar
}
给出
enum Foo {
Bar,
Baz
}
正在改变两行(即像git
这样的工具将显示Bar
行被修改,以及插入的行),即使只有第二行实际上有任何有趣的变化。如果Bar
以尾随逗号开头,则在Baz,
之后插入fn foo(x: u16,) -> (u8, u8,) {
(bar(x,), baz(x,),)
}
,只更改一行。
它们不是必需的(除了1元组之外)因为那是相当奇怪的(IMO),例如
enum
(我想对struct
/ {{1}}声明看起来不那么奇怪,但是,能够省略它很好。)