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


114

查看此CoffeeScript教程:http : //jashkenas.github.com/coffee-script/

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


和往常一样,你也应该知道如何能在香草的js实现:arguments+ callstackoverflow.com/questions/17380315/...
西罗桑蒂利郝海东冠状病六四事件法轮功

1
我喜欢将其视为可以无限期连续地“散布”(例如绘画)的参数
arviman 2014年

3
对于任何喜欢Python的人:这是您的*argsin def foo(*args):
马里格林2015年

1
术语注释:ES6采用了相似但前缀的语法。在ES6中,接收, ...args被称为剩余参数,并扩展...args为函数调用/数组/对象,其字面量被称为扩展
Beni Cherniavsky-Paskin

Answers:


199

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

CoffeeScript很早就采用了Ruby样式的splats(请参阅第16期),但是在Douglas Crockford的建议下,语法已从*x改为x...几周后(请参阅第45期)。尽管如此,CoffeeScripter仍将语法称为“ splat”或“ splat运算符”。

对于它们实际执行的操作,arguments以splats 切片对象的方式使splatted参数成为所有“额外”参数的数组。最简单的例子是

(args...) ->

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

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

在前两种情况下,如果函数接收0-1个参数,rest则将为空数组。在最后一种情况下,该函数需要接收两个以上的参数rest才能为非空。

由于JavaScript不允许具有相同名称的函数使用多个签名(C和Java这样做),因此splats可节省大量时间来处理不同数量的参数。


2
与C#params关键字相似。
马修2012年

我什么时候需要使用它?
杰夫·斯科特·沃德

1
当您不确定要接受的参数数量时。
gprasant

1
技术上称为[杂散函数](en.wikipedia.org/wiki/Variadic_function),或不确定的“ arity”函数。大多数语言使用某种椭圆形式来表示可变参数。
劳伦斯·多尔

1
@JeffScottWard的一个完美示例是console.log,它接受任意数量的参数。console.log('this:',variable,'should be replaced with', another_variable);
罗布

13

如果您了解python,则args...大致类似于*args,因为它允许您将函数参数视为列表

例如:

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

它也可以配合使用:

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

6

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


另请参见:Python的* args和** kwargs,以及ActionScript 3的rest参数。
乔丹

3

我认为这是javascript的arguments对象的语法糖。

这个想法可能来自ruby的splat运算符*


从技术上讲,它要多一些,因为它可以在赋值中用到左侧,并且可以与命名参数结合使用:in中(x, rest...) ->rest不会包含xarguments可以。
keppla 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.