Cosa significa "simboli" nel tutorial di CoffeeScript?


114

Guardando questo tutorial CoffeeScript: http://jashkenas.github.com/coffee-script/

Non vedo bene a cosa servano gli Splats. Cos'è questa costruzione? Da dove viene (storicamente)


E come al solito, si dovrebbe anche sapere come può essere implementato in vaniglia Js: arguments+ call: stackoverflow.com/questions/17380315/...
Ciro Santilli郝海东冠状病六四事件法轮功

1
Mi piace pensarlo come un parametro che viene "splattato" (come la pittura) in un continuum indefinito
arviman

3
Per chiunque Python-inclinato: questo è il vostro *argsa def foo(*args):.
maligree

1
Nota terminologica: ES6 ha adottato una sintassi simile ma prefissa. In ES6 la ricezione , ...argsè denominata parametri di riposo e l'espansione ...argsin una chiamata di funzione / array / valore letterale oggetto è denominata diffusione
Beni Cherniavsky-Paskin

Risposte:


199

Il termine "operatore splat" deriva da Ruby, dove il *carattere (a volte chiamato "splat" - vedi la voce del file in gergo ) è usato per indicare che una voce in un elenco di argomenti dovrebbe "assorbire" un elenco di argomenti.

CoffeeScript ha adottato gli splat in stile Ruby molto presto (vedere il numero 16 ), ma su suggerimento di Douglas Crockford, la sintassi è stata cambiata da *xa x...un paio di settimane dopo (vedere il numero 45 ). Tuttavia, CoffeeScripters fa ancora riferimento alla sintassi come "splat" o "splat operator".

Per quanto riguarda ciò che effettivamente fanno, argumentsgli splat suddividono l' oggetto in modo tale che l'argomento splatted diventi un array di tutti gli argomenti "extra". L'esempio più banale è

(args...) ->

In questo caso, argssarà semplicemente una copia dell'array di arguments. Gli argomenti splattati possono venire prima, dopo o tra argomenti standard:

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

Nei primi due casi, se la funzione riceve 0-1 argomenti, restsarà un array vuoto. Nell'ultimo caso, la funzione deve ricevere più di 2 argomenti perché restnon sia vuota.

Dal momento che JavaScript non consente più firme per funzioni con lo stesso nome (come fanno C e Java), gli simboli splat sono un enorme risparmio di tempo per gestire un numero variabile di argomenti.


2
Simile alla paramsparola chiave C # .
ThatMatthew

Quando mai avrei bisogno di usarlo?
Jeff Scott Ward

1
quando non sei sicuro del numero di parametri che desideri accettare.
gprasant

1
Tecnicamente nota come [funzione variadica] ( en.wikipedia.org/wiki/Variadic_function ), o una funzione di "arità" indefinita. La maggior parte delle lingue utilizza una forma di ellissi di qualche tipo per indicare argomenti variabili.
Lawrence Dol

1
@JeffScottWard un esempio perfetto è console.log, accetta un numero qualsiasi di argomenti. console.log('this:',variable,'should be replaced with', another_variable);
Rob il

13

se conosci python, args...più o meno simile a *args, in quanto ti consente di trattare i parametri della funzione come lista

per esempio:

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

funziona anche in assginments:

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

6

Splats è il termine per l'uso ...dell'operatore per var-args (funzioni che accettano un numero variabile di argomenti).


Vedere anche: * args e ** kwargs di Python e il parametro rest di ActionScript 3.
Jordan

3

Penso che sia uno zucchero sintattico per l'oggetto arguments di javascript.

L'idea potrebbe venire dall'operatore splat* di Ruby .


tecnicamente, è un po 'di più, in quanto può essere usato con il lato sinistro negli incarichi e può essere combinato con argomenti con nome: in (x, rest...) ->, restnon contiene x, argumentsfa.
keppla
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.