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 中不会包含xarguments 会。【参考方案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?

CoffeeScript 中的函数

coffeescript:遍历数组中的对象

如何在 React with Coffeescript 中渲染 HTML 标签?

CoffeeScript 中的私人成员?