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操作符*
。