Was bedeutet "Splats" im CoffeeScript-Tutorial?

114

Schauen Sie sich dieses CoffeeScript-Tutorial an: http://jashkenas.github.com/coffee-script/

Ich verstehe nicht ganz, wofür die Splats sind. Was ist das für eine Konstruktion? Woher kommt es (historisch)

Interstar
quelle
Und wie üblich sollten Sie auch wissen, wie es in Vanilla Js implementiert werden kann: arguments+ call: stackoverflow.com/questions/17380315/…
Ciro Santilli 22 冠状 病 六四 事件 22
1
Ich stelle es mir gerne als einen Parameter vor, der (wie Farbe) in ein unbestimmtes Kontinuum "gespritzt" wird
Arviman
3
Für alle , Python-geneigt: dies ist Ihre *argsin def foo(*args):.
Maligree
1
Terminologie-Hinweis: ES6 hat eine ähnliche Syntax mit Präfix übernommen. In ES6 wird das Empfangen , ...argsals Restparameter bezeichnet und das Erweitern ...argsin ein Funktionsaufruf- / Array- / Objektliteral als Spread bezeichnet
Beni Cherniavsky-Paskin

Antworten:

199

Der Begriff "Splat-Operator" stammt von Ruby, wobei das *Zeichen (manchmal als "Splat" bezeichnet - siehe Jargon- Dateieintrag ) verwendet wird, um anzugeben, dass ein Eintrag in einer Argumentliste eine Liste von Argumenten "aufsaugen" soll.

Coffee angenommen Ruby - Stil splats sehr früh (siehe Ausgabe 16 ), aber bei Douglas Crockford Vorschlag wurde die Syntax von geändert *xzu x...einem paar Wochen später (siehe Frage 45 ). Trotzdem bezeichnen CoffeeScripters die Syntax immer noch als "splat" oder "splat operator".

In Bezug auf das, was sie tatsächlich tun, schneiden Splats das argumentsObjekt so auf, dass das Splatt-Argument zu einem Array aller "zusätzlichen" Argumente wird. Das trivialste Beispiel ist

(args...) ->

In diesem Fall handelt argses sich lediglich um eine Array-Kopie von arguments. Splatted-Argumente können entweder vor, nach oder zwischen Standardargumenten stehen:

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

Wenn die Funktion in den ersten beiden Fällen 0-1 Argumente empfängt, handelt restes sich um ein leeres Array. Im letzten Fall muss die Funktion mehr als 2 Argumente erhalten rest, damit sie nicht leer ist.

Da JavaScript nicht mehrere Signaturen für Funktionen mit demselben Namen zulässt (wie dies bei C und Java der Fall ist), sparen Splats viel Zeit beim Umgang mit unterschiedlich vielen Argumenten.

Trevor Burnham
quelle
2
Ähnlich dem paramsSchlüsselwort C # .
ThatMatthew
Wann würde ich das jemals brauchen?
Jeff Scott Ward
1
wenn Sie sich nicht sicher sind, wie viele Parameter Sie akzeptieren möchten.
Gprasant
1
Technisch bekannt als [variable Funktion] ( en.wikipedia.org/wiki/Variadic_function ) oder als Funktion unbestimmter "Arität". Die meisten Sprachen verwenden eine Ellipsenform, um variable Argumente anzugeben.
Lawrence Dol
1
@ JeffScottWard ein perfektes Beispiel ist console.log, es akzeptiert eine beliebige Anzahl von Argumenten. console.log('this:',variable,'should be replaced with', another_variable);
Rob
13

Wenn Sie Python kennen, args...ähnlich wie Python, *argskönnen Sie Funktionsparameter als Liste behandeln

beispielsweise:

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

es funktioniert auch in Assginments:

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

Splats ist der Begriff für die Verwendung des ...Operators für var-args (Funktionen, die eine variable Anzahl von Argumenten annehmen).

Jeff Foster
quelle
Siehe auch: Pythons * args und ** kwargs sowie der Rest-Parameter von ActionScript 3.
Jordanien
3

Ich denke, es ist ein syntaktischer Zucker für das Argumentobjekt von Javascript.

Die Idee könnte von Rubys Splat-Operator kommen* .

Zifei Tong
quelle
Technisch gesehen ist es ein bisschen mehr, da es in Zuweisungen linksseitig verwendet und mit benannten Argumenten kombiniert werden kann: in (x, rest...) ->, wird restnicht enthalten x, argumentstut es.
Keppla