CoffeeScript 教程中的“Splats”是啥意思?
Posted
技术标签:
【中文标题】CoffeeScript 教程中的“Splats”是啥意思?【英文标题】:What does "Splats" mean in the CoffeeScript tutorial?CoffeeScript 教程中的“Splats”是什么意思? 【发布时间】:2011-09-06 07:07:39 【问题描述】:查看此 CoffeeScript 教程:http://jashkenas.github.com/coffee-script/
我不太明白 Splats 的用途。这是什么建筑?它来自哪里(历史上)
【问题讨论】:
和往常一样,你也应该知道如何在 vanilla Js 中实现它:arguments
+ call
:***.com/questions/17380315/…
我喜欢把它想象成一个参数,它被“喷溅”(如油漆)成一个不确定的连续体
对于任何喜欢 Python 的人:这是你的 *args
in def foo(*args):
。
术语说明:ES6 采用了类似但前缀的语法。在 ES6 中接收, ...args
被命名为rest parameters 并将...args
扩展为函数调用/数组/对象字面量命名为spread
【参考方案1】:
Splats 是使用 ...
运算符的术语,用于 var-args(采用可变数量参数的函数)。
【讨论】:
另见:Python 的 *args 和 **kwargs,以及 ActionScript 3 的 rest 参数。【参考方案2】:如果你了解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]
【讨论】:
【参考方案3】:我认为它是 javascript 参数对象的语法糖。
这个想法可能来自 ruby 的splat operator *
。
【讨论】:
从技术上讲,它有点多,因为它可以在赋值中使用左侧,并且可以与命名参数组合:在(x, rest...) ->
,rest
中不会包含x
, arguments
会。【参考方案4】:
术语“splat 运算符”来自 Ruby,其中*
字符(有时称为“splat”——参见 the Jargon File entry)用于表示参数列表中的条目应该“吸收”一个列表论据。
CoffeeScript 很早就采用了 Ruby 风格的 splats(参见 issue 16),但在 Douglas Crockford 的建议下,几周后语法从 *x
更改为 x...
(参见 issue 45)。尽管如此,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 的做法),所以 splat 可以节省大量时间来处理不同数量的参数。
【讨论】:
类似于 C#params
关键字。
我什么时候需要使用这个?
当您不确定要接受的参数数量时。
技术上称为 [variadic function] (en.wikipedia.org/wiki/Variadic_function),或不定“arity”的函数。大多数语言使用某种形式的省略号来表示可变参数。
@JeffScottWard 一个完美的例子是 console.log,它接受任意数量的参数。 console.log('this:',variable,'should be replaced with', another_variable);
以上是关于CoffeeScript 教程中的“Splats”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
没有 CoffeeScript 的 CoffeeScript 中的问号语法
是否/为啥 Rails 6 仍在使用/推荐 CoffeeScript?