Que signifie «Splats» dans le didacticiel CoffeeScript?

114

En regardant ce tutoriel CoffeeScript: http://jashkenas.github.com/coffee-script/

Je ne vois pas vraiment à quoi servent les Splats. Quelle est cette construction? D'où vient-il (historiquement)

interstar
la source
Et comme d'habitude, vous devriez aussi savoir comment il peut être implémenté dans vanilla Js: arguments+ call: stackoverflow.com/questions/17380315/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
J'aime penser à cela comme un paramètre qui est «éclaboussé» (comme la peinture) dans un continuum indéfini
arviman
3
Pour tout le monde incliné Python: ceci est votre *argsdans def foo(*args):.
maligree
1
Note terminologique: ES6 a adopté une syntaxe similaire mais préfixée. Dans ES6, la réception , ...argsest appelée paramètres de repos et l'expansion ...argsdans un littéral de fonction appel / tableau / objet est nommée spread
Beni Cherniavsky-Paskin

Réponses:

199

Le terme "opérateur splat" vient de Ruby, où le *caractère (parfois appelé "splat" - voir l'entrée Jargon File ) est utilisé pour indiquer qu'une entrée dans une liste d'arguments doit "absorber" une liste d'arguments.

CoffeeScript a adopté très tôt les splats de style Ruby (voir numéro 16 ), mais à la suggestion de Douglas Crockford, la syntaxe a été modifiée de *xà x...quelques semaines plus tard (voir numéro 45 ). Néanmoins, les CoffeeScripters se réfèrent toujours à la syntaxe comme «splat» ou «splat operator».

Quant à ce qu'ils font réellement, les splats découpent l' argumentsobjet de telle manière que l'argument splatté devient un tableau de tous les arguments "supplémentaires". L'exemple le plus trivial est

(args...) ->

Dans ce cas, argssera simplement une copie de tableau de arguments. Les arguments splattés peuvent être placés avant, après ou entre les arguments standard:

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

Dans les deux premiers cas, si la fonction reçoit 0-1 arguments, restsera un tableau vide. Dans le dernier cas, la fonction doit recevoir plus de 2 arguments pour restêtre non vide.

Étant donné que JavaScript n'autorise pas plusieurs signatures pour les fonctions portant le même nom (comme le font C et Java), les splats sont un gain de temps considérable pour traiter un nombre variable d'arguments.

Trevor Burnham
la source
2
Similaire au paramsmot clé C # .
ThatMatthew
Quand aurais-je besoin de l'utiliser?
Jeff Scott Ward
1
lorsque vous n'êtes pas sûr du nombre de paramètres que vous souhaitez accepter.
gprasant
1
Techniquement connue sous le nom de [fonction variadique] ( en.wikipedia.org/wiki/Variadic_function ), ou une fonction «d'arité» indéfinie. La plupart des langages utilisent une forme d'ellipses quelconque pour indiquer des arguments variables.
Lawrence Dol
1
@JeffScottWard un exemple parfait est console.log, il accepte n'importe quel nombre d'arguments. console.log('this:',variable,'should be replaced with', another_variable);
Rob
13

si vous connaissez python, à args...peu près similaire à *args, car il vous permet de traiter les paramètres de fonction comme une liste

par exemple:

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

cela fonctionne aussi dans les assginments:

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

Splats est le terme pour l'utilisation de l' ...opérateur pour var-args (fonctions qui acceptent un nombre variable d'arguments).

Jeff Foster
la source
Voir aussi: * args et ** kwargs de Python, et paramètre rest d'ActionScript 3.
Jordan
3

Je pense que c'est un sucre syntaxique pour l'objet d'arguments de javascript.

L'idée peut venir de l' opérateur splat* de ruby .

Zifei Tong
la source
techniquement, c'est un peu plus, car il peut être utilisé à gauche dans les affectations et peut être combiné avec des arguments nommés: in (x, rest...) ->, restwont contain x, argumentsdoes.
keppla