为什么以及何时应该在块的末尾使用逗号?
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
声明看起来不那么奇怪,但是,能够省略它仍然很好。)
在 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
声明看起来不那么奇怪,但是,能够省略它仍然很好。)