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

hel*_*low 2 rust

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

fn foo(_a: u8) {}

fn main() {
    foo(3, );
}
Run Code Online (Sandbox Code Playgroud)

Sve*_*ach 7

大多数语言都接受逗号分隔列表中的尾随逗号,如参数列表或元组或数组文字.如果您将列表拆分为多行,这将非常有用,例如:

let a = [
    0,
    1,
    2,
    3,
];
Run Code Online (Sandbox Code Playgroud)

由于所有行都以逗号结尾,因此您可以轻松地对编辑器中的行重新排序,并且差异在版本控制中看起来更干净,特别是在向列表末尾添加更多条目时.这似乎不是允许尾随逗号的强有力理由,但由于允许逗号逗号永远不会受到伤害,因此它足以作为理由.

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

随着时间的推移,其他语言的历史也越来越宽松.JavaScript总是允许在数组文字中使用尾随逗号.他们允许它在EcmaScript 5中用于对象文字,在EcmaScript 2017中用于函数参数列表,而标准JSON仍然不允许使用尾随逗号.蟒蛇并没有让尾随逗号后*args**kwargs直到最近,但现在他们也是允许的.