Apa arti "Percikan" dalam tutorial CoffeeScript?

114

Lihat tutorial CoffeeScript ini: http://jashkenas.github.com/coffee-script/

Saya tidak begitu mengerti untuk apa percikan itu. Konstruksi apa ini? Dari mana asalnya (secara historis)

interstar
sumber
Dan seperti biasa, Anda juga harus tahu bagaimana hal itu dapat diterapkan di vanilla Js: arguments+ call: stackoverflow.com/questions/17380315/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Saya suka menganggapnya sebagai parameter yang "terciprat" (seperti cat) ke dalam kontinum yang tidak terbatas
arviman
3
Bagi siapa pun Python-cenderung: ini adalah Anda *argsdi def foo(*args):.
maligree
1
Catatan terminologi: ES6 mengadopsi sintaks yang mirip tetapi awalan. Dalam ES6, penerimaan , ...argsdinamai parameter istirahat dan berkembang ...argsmenjadi panggilan fungsi / array / objek literal dinamai menyebar
Beni Cherniavsky-Paskin

Jawaban:

199

Istilah "operator percikan" berasal dari Ruby, di mana *karakter (kadang-kadang disebut "percikan" —lihat entri File Jargon ) digunakan untuk menunjukkan bahwa entri dalam daftar argumen harus "menyerap" daftar argumen.

CoffeeScript mengadopsi lingkar Ruby-gaya yang sangat dini (lihat masalah 16 ), tetapi pada saran Douglas Crockford, sintaks berubah dari *xke x...beberapa minggu kemudian (lihat masalah 45 ). Namun demikian, CoffeeScripters masih mengacu pada sintaks sebagai "splat" atau "splat operator."

Mengenai apa yang sebenarnya mereka lakukan, percikan mengiris argumentsobjek sedemikian rupa sehingga argumen yang dicipratkan menjadi larik dari semua argumen "ekstra". Contoh paling sepele adalah

(args...) ->

Dalam hal ini, argshanya akan menjadi salinan array arguments. Argumen percikan bisa muncul sebelum, sesudah, atau di antara argumen standar:

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

Dalam dua kasus pertama, jika fungsi menerima 0-1 argumen, restakan menjadi array kosong. Dalam kasus terakhir, fungsi perlu menerima lebih dari 2 argumen restagar tidak kosong.

Karena JavaScript tidak mengizinkan banyak tanda tangan untuk fungsi dengan nama yang sama (seperti yang dilakukan C dan Java), percikan adalah penghemat waktu yang sangat besar untuk menangani berbagai jumlah argumen.

Trevor Burnham
sumber
2
Mirip dengan paramskata kunci C # .
ThatMatthew
Kapan saya perlu menggunakan ini?
Jeff Scott Ward
1
bila Anda tidak yakin dengan jumlah params yang ingin Anda terima.
gprasant
1
Secara teknis dikenal sebagai [fungsi variadic] ( en.wikipedia.org/wiki/Variadic_function ), atau fungsi dari "arity" tidak terbatas. Kebanyakan bahasa menggunakan bentuk elipsis untuk menunjukkan argumen variabel.
Lawrence Dol
1
@JeffScottWard contoh sempurna adalah console.log, ia menerima sejumlah argumen. console.log('this:',variable,'should be replaced with', another_variable);
Rob
13

jika Anda tahu python, args...kira-kira mirip dengan *args, karena memungkinkan Anda untuk memperlakukan parameter fungsi sebagai daftar

sebagai contoh:

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

ini juga berfungsi dalam tugas:

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

Percikan adalah istilah untuk penggunaan ...operator untuk var-args (fungsi yang mengambil sejumlah variabel argumen).

Jeff Foster
sumber
Lihat juga: * args dan ** kwargs Python, dan parameter rest ActionScript 3.
Yordania
3

Saya pikir itu adalah gula sintaksis untuk objek argumen javascript.

Idenya mungkin datang dari operator percikan* Ruby .

Zifei Tong
sumber
Secara teknis, ini sedikit lebih banyak, karena dapat digunakan di sisi kiri dalam tugas, dan dapat dikombinasikan dengan argumen bernama: in (x, rest...) ->, restwont contains x, argumentsdoes.
keppla