¿Qué significa "Splats" en el tutorial de CoffeeScript?

114

Mirando este tutorial de CoffeeScript: http://jashkenas.github.com/coffee-script/

No veo muy bien para qué sirven los Splats. ¿Qué es esta construcción? De donde viene (historicamente)

interestar
fuente
Y como de costumbre, también debe saber cómo se puede implementar en vanilla Js: arguments+ call: stackoverflow.com/questions/17380315/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Me gusta pensar en él como un parámetro que se "salpica" (como pintura) en un continuo indefinido
arviman
3
Para cualquier persona inclinada en Python: esta es tu *argsen def foo(*args):.
maligre
1
Nota terminológica: ES6 adoptó una sintaxis similar pero con prefijo. En ES6, la recepción , ...argsse denomina parámetros de descanso y la expansión ...argsen una llamada de función / matriz / objeto literal se denomina propagación
Beni Cherniavsky-Paskin

Respuestas:

199

El término "operador de splat" proviene de Ruby, donde el *carácter (a veces llamado "splat", ver la entrada del Archivo de jerga ) se usa para indicar que una entrada en una lista de argumentos debe "absorber" una lista de argumentos.

CoffeeScript adoptó símbolos de estilo Ruby desde el principio (ver número 16 ), pero por sugerencia de Douglas Crockford, la sintaxis se cambió de *xa x...un par de semanas más tarde (ver número 45 ). Sin embargo, CoffeeScripters todavía se refiere a la sintaxis como "splat" o "operador de splat".

En cuanto a lo que realmente hacen, los símbolos cortan el argumentsobjeto de tal manera que el argumento dividido se convierte en una matriz de todos los argumentos "adicionales". El ejemplo más trivial es

(args...) ->

En este caso, argsserá simplemente una copia de matriz de arguments. Los argumentos salpicados pueden aparecer antes, después o entre los argumentos estándar:

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

En los dos primeros casos, si la función recibe 0-1 argumentos, restserá una matriz vacía. En el último caso, la función necesita recibir más de 2 argumentos para restno estar vacía.

Dado que JavaScript no permite múltiples firmas para funciones con el mismo nombre (como lo hacen C y Java), los símbolos son un gran ahorro de tiempo para tratar con diferentes números de argumentos.

Trevor Burnham
fuente
2
Similar a la paramspalabra clave C # .
ThatMatthew
¿Cuándo necesitaría usar esto?
Jeff Scott Ward
1
cuando no está seguro de la cantidad de parámetros que desea aceptar.
gprasant
1
Técnicamente conocido como una [función variadic] ( en.wikipedia.org/wiki/Variadic_function ), o una función de "aridad" indefinida. La mayoría de los lenguajes usan una forma de elipses de algún tipo para indicar argumentos variables.
Lawrence Dol
1
@JeffScottWard un ejemplo perfecto es console.log, acepta cualquier número de argumentos. console.log('this:',variable,'should be replaced with', another_variable);
Rob
13

si conoce Python, args...más o menos similar a *args, ya que le permite tratar los parámetros de función como una lista

por ejemplo:

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

también funciona en asignaciones:

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

Splats es el término para el uso del ...operador para var-args (funciones que toman un número variable de argumentos).

Jeff Foster
fuente
Consulte también: * args y ** kwargs de Python y el parámetro rest de ActionScript 3.
Jordan
3

Creo que es un azúcar sintáctico para el objeto de argumentos de javascript.

La idea puede surgir del operador splat* de Ruby .

Zifei Tong
fuente
técnicamente, es un poco más, ya que se puede usar del lado izquierdo en las asignaciones y se puede combinar con argumentos con nombre: in (x, rest...) ->, restwont contains x, argumentsdoes.
keppla