Co oznaczają „ikony” w samouczku CoffeeScript?

114

Patrząc na ten samouczek CoffeeScript: http://jashkenas.github.com/coffee-script/

Nie bardzo rozumiem, do czego służą ikony Splats. Co to za konstrukcja? Skąd się to wzięło (historycznie)

interstar
źródło
I jak zwykle powinieneś również wiedzieć, jak można to zaimplementować w waniliowym Js: arguments+ call: stackoverflow.com/questions/17380315/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Lubię myśleć o tym jako o parametrze, który zostaje „rozpryskany” (jak farba) w nieokreślone kontinuum
arviman
3
Dla każdego, Python-nachylonej: jest to Twoja *argsw def foo(*args):.
maligree
1
Uwaga terminologiczna: ES6 przyjęła podobną, ale przedrostkową składnię. W ES6 odbieranie , ...argsnosi nazwę parametrów reszta, a rozszerzenie ...argsdo wywołania funkcji / tablicy / literału obiektu nosi nazwę spread
Beni Cherniavsky-Paskin

Odpowiedzi:

199

Termin „operator splat” pochodzi z języka Ruby, gdzie *znak (czasami nazywany „ikoną” - patrz pozycja pliku żargonu ) jest używany do wskazania, że ​​wpis na liście argumentów powinien „wchłonąć” listę argumentów.

CoffeeScript bardzo wcześnie zaadaptował ikony w stylu Ruby (zobacz numer 16 ), ale zgodnie z sugestią Douglasa Crockforda składnia została zmieniona z *xna x...kilka tygodni później (zobacz numer 45 ). Niemniej jednak CoffeeScripters nadal odwołuje się do składni jako operatora „splat” lub „splat”.

Co do tego, co faktycznie robią, ikony argumentsdzielą obiekt w taki sposób, że splatowany argument staje się tablicą wszystkich „dodatkowych” argumentów. Najbardziej trywialnym przykładem jest

(args...) ->

W tym przypadku argsbędzie to po prostu kopia tablicy arguments. Splatted argumenty mogą występować przed, po lub między standardowymi argumentami:

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

W pierwszych dwóch przypadkach, jeśli funkcja otrzyma 0-1 argumentów, restbędzie pustą tablicą. W ostatnim przypadku funkcja musi otrzymać więcej niż 2 argumenty, restaby nie była pusta.

Ponieważ JavaScript nie zezwala na wiele podpisów dla funkcji o tej samej nazwie (tak jak robią to C i Java), ikony splats pozwalają na ogromną oszczędność czasu przy pracy z różną liczbą argumentów.

Trevor Burnham
źródło
2
Podobny do paramssłowa kluczowego C # .
ThatMatthew
Kiedy kiedykolwiek będę musiał tego używać?
Jeff Scott Ward
1
gdy nie masz pewności co do liczby parametrów, które chcesz zaakceptować.
gprasant
1
Technicznie znana jako [funkcja wariadyczna] ( en.wikipedia.org/wiki/Variadic_function ) lub funkcja o nieokreślonej „arity”. Większość języków używa jakiegoś rodzaju wielokropka do wskazania zmiennych argumentów.
Lawrence Dol
1
@JeffScottWard doskonałym przykładem jest console.log, przyjmuje dowolną liczbę argumentów. console.log('this:',variable,'should be replaced with', another_variable);
Rob
13

jeśli znasz Pythona, z args...grubsza podobny *args, ponieważ pozwala on traktować parametry funkcji jako listę

na przykład:

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

działa też w zadaniach:

[first, rest...] = [1, 2, 3, 4]
first == 1
rest == [2, 3, 4]
keppla
źródło
6

Splats to termin określający użycie ...operatora dla zmiennych argumentów (funkcji, które przyjmują zmienną liczbę argumentów).

Jeff Foster
źródło
Zobacz też: * args i ** kwargs w Pythonie oraz parametr rest w ActionScript 3.
Jordania
3

Myślę, że jest to cukier składniowy dla obiektu arguments JavaScript.

Pomysł może pochodzić od operatora splat* Rubiego .

Zifei Tong
źródło
technicznie jest to trochę więcej, ponieważ może być używane lewostronnie w zadaniach i może być łączone z nazwanymi argumentami: in (x, rest...) ->, restnie zawiera x, argumentsnie.
keppla