为什么函数调用中的尾部逗号不是语法错误?

时间:2018-12-07 15:11:13

标签: rust

我希望此代码失败,因为逗号充当参数分隔符。没有第二个参数,foo仅接受一个参数。

fn foo(_a: u8) {}

fn main() {
    foo(3, );
}

1 个答案:

答案 0 :(得分:7)

大多数语言都接受逗号分隔的列表中的尾部逗号,例如参数列表或元组或数组文字。如果您将列表分成多行,例如,

let a = [
    0,
    1,
    2,
    3,
];

由于所有行均以逗号结尾,因此您可以轻松地在编辑器中对行进行重新排序,并且diff在版本控制中看起来更清晰,尤其是在列表末尾添加更多条目时。这似乎不是允许使用逗号结尾的强烈理由,但是由于允许使用逗号永远不会造成伤害,因此从理论上讲已经足够了。

请注意,Rust中的宏调用并不总是允许尾随逗号。

随着时间的流逝,其他语言对尾随逗号的使用越来越宽容。 JavaScript始终在数组文字中允许使用逗号结尾。他们允许EcmaScript 5中的对象文字和EcmaScript 2017中的函数参数列表使用它,而标准JSON仍然不允许尾随逗号。直到最近,Python都不允许*args**kwargs之后的逗号结尾,但现在也允许它们。