O que “Splats” significa no tutorial do CoffeeScript?

114

Olhando para este tutorial do CoffeeScript: http://jashkenas.github.com/coffee-script/

Não vejo bem para que serve o Splats. Que construção é essa? De onde vem (historicamente)

interstar
fonte
E, como de costume, você também deve saber como pode ser implementado no vanilla Js: arguments+ call: stackoverflow.com/questions/17380315/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Eu gosto de pensar nisso como um parâmetro que é "espalhado" (como tinta) em um continuum indefinido
arviman
3
Para qualquer pessoa inclinada a Python: este é o seu *argslugar def foo(*args):.
Maligree,
1
Nota de terminologia: ES6 adotou sintaxe semelhante, mas com prefixo. Em ES6, o recebimento , ...argsé denominado parâmetros de descanso e a expansão ...argsem uma chamada de função / array / objeto literal é denominado spread
Beni Cherniavsky-Paskin

Respostas:

199

O termo "operador splat" vem do Ruby, onde o *caractere (às vezes chamado de "splat" - consulte a entrada Jargon File ) é usado para indicar que uma entrada em uma lista de argumentos deve "absorver" uma lista de argumentos.

CoffeeScript adotou splats no estilo Ruby muito cedo (consulte a edição 16 ), mas por sugestão de Douglas Crockford, a sintaxe foi alterada *xpara x...algumas semanas depois (consulte a edição 45 ). Mesmo assim, os CoffeeScripters ainda se referem à sintaxe como "operador splat" ou "splat".

Quanto ao que eles realmente fazem, os splats cortam o argumentsobjeto de tal forma que o argumento splat torna-se um array de todos os argumentos "extras". O exemplo mais trivial é

(args...) ->

Nesse caso, argsserá simplesmente uma cópia do array arguments. Os argumentos divididos podem vir antes, depois ou entre os argumentos padrão:

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

Nos primeiros dois casos, se a função receber 0-1 argumentos, restserá um array vazio. No último caso, a função precisa receber mais de 2 argumentos para restnão ficar vazia.

Uma vez que o JavaScript não permite várias assinaturas para funções com o mesmo nome (como fazem C e Java), os splats economizam muito tempo para lidar com vários números de argumentos.

Trevor Burnham
fonte
2
Semelhante à paramspalavra-chave C # .
ThatMatthew
Quando eu precisaria usar isso?
Jeff Scott Ward
1
quando você não tem certeza do número de parâmetros que deseja aceitar.
gprasant
1
Tecnicamente conhecido como [função variadic] ( en.wikipedia.org/wiki/Variadic_function ) ou uma função de "aridade" indefinida. A maioria das linguagens usa uma forma de elipses de algum tipo para indicar argumentos variáveis.
Lawrence Dol
1
@JeffScottWard um exemplo perfeito é console.log, ele aceita qualquer número de argumentos. console.log('this:',variable,'should be replaced with', another_variable);
Rob
13

se você conhece python, args...aproximadamente semelhante a *args, pois permite que você trate os parâmetros de função como uma lista

por exemplo:

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

ele funciona em atribuições também:

[first, rest...] = [1, 2, 3, 4]
first == 1
rest == [2, 3, 4]
keppla
fonte
6

Splats é o termo para o uso do ...operador para var-args (funções que recebem um número variável de argumentos).

Jeff Foster
fonte
Consulte também: * args e ** kwargs do Python e o parâmetro rest do ActionScript 3.
Jordânia
3

Eu acho que é um açúcar sintático para o objeto de argumentos do javascript.

A ideia pode surgir do operador splat* de ruby .

Zifei Tong
fonte
tecnicamente, é um pouco mais, já que pode ser usado no lado esquerdo em atribuições e pode ser combinado com argumentos nomeados: in (x, rest...) ->, restwont contain x, argumentsdoes.
keppla