下面是一个例子:
struct User { user: String, email: String, }
字符串编译器并没有抱怨。email字段后面的逗号让我觉得很奇怪,所以我尝试了这个:
email
struct User { user: String, email: String // no comma }
型编译器仍然没有抱怨。这两个场景有什么区别吗?或者是完全等同的?
dl5txlt91#
在struct定义中,最后一个逗号是可选的。这纯粹是为了方便;它允许您保留结尾的逗号,因此如果您添加额外的字段,删除字段或更改它们的顺序,您不必返回并修改行。巧合的是,它也使从宏生成代码变得更容易,因为您的codegen宏不再需要关心跟踪您是否在最后生成的字段上。
struct
有一次,您会看到尾部逗号是强制性的,这是在像dieseltable!宏这样的宏中,原因在于diesel开发人员选择的宏调用结构。
diesel
table!
juzqafwq2#
不得不说,你是一个敏锐的观察者。他们是等价的根据rust reference:结构字段:StructField(,StructField)*,?这样做是为了方便:能够添加或删除行而不触及以前的行。这里有一个反例。在没有这种便利的语言中,人们可能会选择以不寻常的方式格式化代码,以实现几乎相同的效果,例如:
data Person = Person { firstName :: String , lastName :: String , age :: Int }
字符串我更喜欢一个可选的尾随逗号。
n3h0vuf23#
添加一个尾随逗号,使其更容易添加一个字段在未来违背XP“YAGNI“你不会需要它的原则。计划一些未来的增强是浪费时间,因为当“未来”到来的时候,该增强的要求将从我,在我无限明智的远见,我以为他们会很久以前。另一方面,我可以看到逗号是有用的,使“差异”输出不那么“嘈杂”。据this rust-lang.org thread上的人说,最后一个字段的结尾逗号使自动代码生成更容易,因为它不必处理“这是最后一个字段吗?”“问题。还有一些关于宏生成的东西,我在氧化教育中还不理解。逗号也使重新排列结构中字段的顺序变得更容易,但是同样,规划未来应该等待未来。
3条答案
按热度按时间dl5txlt91#
在
struct
定义中,最后一个逗号是可选的。这纯粹是为了方便;它允许您保留结尾的逗号,因此如果您添加额外的字段,删除字段或更改它们的顺序,您不必返回并修改行。巧合的是,它也使从宏生成代码变得更容易,因为您的codegen宏不再需要关心跟踪您是否在最后生成的字段上。
有一次,您会看到尾部逗号是强制性的,这是在像
diesel
table!
宏这样的宏中,原因在于diesel
开发人员选择的宏调用结构。juzqafwq2#
不得不说,你是一个敏锐的观察者。他们是等价的根据rust reference:
结构字段:
StructField(,StructField)*,?
这样做是为了方便:能够添加或删除行而不触及以前的行。
这里有一个反例。在没有这种便利的语言中,人们可能会选择以不寻常的方式格式化代码,以实现几乎相同的效果,例如:
字符串
我更喜欢一个可选的尾随逗号。
n3h0vuf23#
添加一个尾随逗号,使其更容易添加一个字段在未来违背XP“YAGNI“你不会需要它的原则。计划一些未来的增强是浪费时间,因为当“未来”到来的时候,该增强的要求将从我,在我无限明智的远见,我以为他们会很久以前。另一方面,我可以看到逗号是有用的,使“差异”输出不那么“嘈杂”。
据this rust-lang.org thread上的人说,最后一个字段的结尾逗号使自动代码生成更容易,因为它不必处理“这是最后一个字段吗?”“问题。还有一些关于宏生成的东西,我在氧化教育中还不理解。逗号也使重新排列结构中字段的顺序变得更容易,但是同样,规划未来应该等待未来。