CoffeeScript eğitiminde "Uyarılar" ne anlama geliyor?


114

Şu CoffeeScript eğitimine bakın: http://jashkenas.github.com/coffee-script/

Splats'ın ne için olduğunu tam olarak anlamıyorum. Bu yapı nedir? Nereden geliyor (tarihsel olarak)


Ve her zamanki gibi, vanilya argumentscall
Js'de

1
Bunu, belirsiz bir sürekliliğe "sıçrayan" (boya gibi) bir parametre olarak düşünmeyi seviyorum
arviman

3
Python eğimli herkes için: Bu sizin olduğunu *argsiçinde def foo(*args):.
maligree

1
Terminoloji notu: ES6, benzer ancak önek sözdizimini benimsemiştir. ES6 alıcı olarak , ...argsadlandırılır dinlenme parametreleri ve genişleyen ...argsadlı bir işlev çağrısı / dizi / nesnesi değişmez içine yayılmış
Beni Cherniavsky-Paskin

Yanıtlar:


199

"Uyarlama operatörü" terimi Ruby'den gelir, burada *karakter (bazen "uyarlama" olarak adlandırılır - Jargon Dosyası girişine bakın ), bir argüman listesindeki bir girişin bir argüman listesini "emmesi" gerektiğini belirtmek için kullanılır.

CoffeeScript çok erken (bkz Yakut tarzı uyarıları kabul konuyu 16 ), ancak Douglas Crockford önerisiyle, sözdizimi değiştirildi *xiçin x...(bkz sonra birkaç hafta sorununu 45 ). Yine de, CoffeeScripters sözdizimine hala "uyarma" veya "uyarlama operatörü" olarak başvurur.

Gerçekte ne yaptıklarına gelince, uyarlamalar argumentsnesneyi, splatted argüman tüm "ekstra" argümanların bir dizisi haline gelecek şekilde dilimler . En önemsiz örnek

(args...) ->

Bu durumda, argsbasitçe bir dizi kopyası olacaktır arguments. Yapıştırılmış argümanlar standart argümanlardan önce, sonra veya arasında gelebilir:

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

İlk iki durumda, eğer fonksiyon 0-1 argüman alırsa, restboş bir dizi olacaktır. Son durumda, işlevin restboş olmaması için 2'den fazla argüman alması gerekir.

JavaScript, aynı ada sahip işlevler için birden fazla imzaya izin vermediğinden (C ve Java'nın yaptığı gibi), uyarılar, çeşitli sayıdaki argümanlarla başa çıkmak için büyük bir zaman tasarrufu sağlar.


2
C # paramsanahtar kelimesine benzer .
ThatMatthew

Bunu ne zaman kullanmam gerekecek?
Jeff Scott Ward

1
kabul etmek istediğiniz parametrelerin sayısından emin değilseniz.
gprasant

1
Teknik olarak [variadic function] ( en.wikipedia.org/wiki/Variadic_function ) veya belirsiz "arity" işlevi olarak bilinir. Çoğu dil, değişken bağımsız değişkenleri belirtmek için bir tür elips biçimini kullanır.
Lawrence Dol

1
@JeffScottWard mükemmel bir örnek console.log'dur, herhangi bir sayıda argümanı kabul eder. console.log('this:',variable,'should be replaced with', another_variable);
Rob

13

Python'u biliyorsanız, args...kabaca benzer *args, çünkü işlev parametrelerini liste olarak işlemenize izin verir

Örneğin:

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

değerlendirmelerde de işe yarar:

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

6

Splats, ...operatörün var-args (değişken sayıda argüman alan fonksiyonlar) için kullanımı için kullanılan terimdir .


Ayrıca bkz: Python'un * args and ** kwargs ve ActionScript 3'ün rest parametresi.
Ürdün

3

Javascript'in arguments nesnesi için sözdizimsel bir şeker olduğunu düşünüyorum.

Fikir, Ruby'nin uyarıcı operatöründen* gelebilir .


teknik olarak, ödevlerde sol taraflı kullanılabildiğinden ve adlandırılmış argümanlarla birleştirilebildiğinden biraz daha fazladır: in (x, rest...) ->, restwont include x, argumentsdoes.
keppla
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.