CoffeeScript教程中的“Splats”是什么意思?

看这个CoffeeScript教程: http : //jashkenas.github.com/coffee-script/

我不太清楚Splats的用途。 这是什么结构? 它从哪里来(历史上)

术语“splat运算符”来自Ruby,其中*字符(有时称为“splat” – 参见Jargon File条目 )用于指示参数列表中的条目应该“吸收”参数列表。

CoffeeScript在很早的时候就采用了Ruby风格的splats(参见问题16 ),但是在Douglas Crockford的build议中,几个星期之后,语法从*x变成了x... (见问题45 )。 尽pipe如此,CoffeeScripters仍将语法称为“splat”或“splat运算符”。

至于他们实际上做了什么,splats将arguments对象分割成splatted参数成为所有“额外”参数的数组。 最微不足道的例子是

 (args...) -> 

在这种情况下, args将只是arguments的数组副本。 Splatted参数可以在标准参数之前,之后或之间出现:

 (first, rest...) -> (rest..., last) -> (first, rest..., last) -> 

在前两种情况下,如果函数接收到0-1个参数, rest将是一个空数组。 在最后一种情况下,函数需要接收2个以上的静态参数rest非空的。

由于JavaScript不允许使用同名的函数(C和Java的方式)进行多重签名,所以splats对于处理不同数量的参数来说是一个非常节省时间的方法。

如果您知道python, args...*args大致相似,因为它允许您将函数参数视为列表

例如:

 concat = (args...) -> args.join(', ') concat('hello', 'world') == 'hello, world' concat('ready', 'set', 'go!') == 'ready, set, go!' 

它也适用于assginments:

 [first, rest...] = [1, 2, 3, 4] first == 1 rest == [2, 3, 4] 

Splats是var-args(使用可变数量的参数的函数)使用...运算符的术语。

我认为这是一个JavaScript的参数对象的语法糖。

这个想法可能来自ruby的splat操作符*