Rust结构定义中的最后一个逗号是必要的吗?

nxowjjhe  于 2023-11-19  发布在  其他
关注(0)|答案(3)|浏览(127)

下面是一个例子:

struct User {
    user: String,
    email: String,
}

字符串
编译器并没有抱怨。email字段后面的逗号让我觉得很奇怪,所以我尝试了这个:

struct User {
    user: String,
    email: String // no comma
}


编译器仍然没有抱怨。这两个场景有什么区别吗?或者是完全等同的?

dl5txlt9

dl5txlt91#

struct定义中,最后一个逗号是可选的。这纯粹是为了方便;它允许您保留结尾的逗号,因此如果您添加额外的字段,删除字段或更改它们的顺序,您不必返回并修改行。
巧合的是,它也使从宏生成代码变得更容易,因为您的codegen宏不再需要关心跟踪您是否在最后生成的字段上。

有一次,您会看到尾部逗号是强制性的,这是在像dieseltable!宏这样的宏中,原因在于diesel开发人员选择的宏调用结构。

juzqafwq

juzqafwq2#

不得不说,你是一个敏锐的观察者。他们是等价的根据rust reference
结构字段:
StructField(,StructField)*,?
这样做是为了方便:能够添加或删除行而不触及以前的行。
这里有一个反例。在没有这种便利的语言中,人们可能会选择以不寻常的方式格式化代码,以实现几乎相同的效果,例如:

data Person = Person
    { firstName :: String
    , lastName  :: String
    , age       :: Int
    }

字符串
我更喜欢一个可选的尾随逗号。

n3h0vuf2

n3h0vuf23#

添加一个尾随逗号,使其更容易添加一个字段在未来违背XP“YAGNI“你不会需要它的原则。计划一些未来的增强是浪费时间,因为当“未来”到来的时候,该增强的要求将从我,在我无限明智的远见,我以为他们会很久以前。另一方面,我可以看到逗号是有用的,使“差异”输出不那么“嘈杂”。
this rust-lang.org thread上的人说,最后一个字段的结尾逗号使自动代码生成更容易,因为它不必处理“这是最后一个字段吗?”“问题。还有一些关于宏生成的东西,我在氧化教育中还不理解。逗号也使重新排列结构中字段的顺序变得更容易,但是同样,规划未来应该等待未来。

相关问题