CoffeeScript kullanarak bir şeyi iade etmemenin bir yolu var mı?


116

CoffeeScript bir kapsamdaki son öğeyi otomatik olarak döndürüyor gibi görünüyor. Bu işlevsellikten kaçınabilir miyim?


Neden istiyorsun İstediğiniz zaman iade edilen değeri göz ardı edemez misiniz?
Chris

11
@Chris: Anlamlı bir dönüş değeri olmadığında, son cümlenin sonucu olan ne olursa olsun sızdırmak iyi bir fikir değildir.

11
@Chris bunun, kavrama / for / while döngüleri ile performans etkileri olabilir, çünkü coffeescript, döngünün dönüş değeri kullanılırsa (veya bir işlevin son ifadesiyse) bir dizideki her yinelemenin sonucunu toplayabilir
Arnaud Le Blanc

1
Bu sorunu bir müteahhitle yaşadım. Yapıcının son satırında bir fonksiyon tanımladım. Yani bu benim "Sınıf İşlevi" yerine döndürüldü. Bunu açıkça iade etmem gerekiyordu. Sadece bunun bir sorun olabileceğini söylüyorum.
Markus

Yanıtlar:


150

Açıkça hiçbir şey döndürmemeniz veya işlevinizin altında tanımsız olarak değerlendirilen bir ifade bırakmanız gerekir:

fun = ->
    doSomething()
    return

Veya:

fun = ->
    doSomething()
    undefined

Kavramları kullanırken dokümanın önerdiği şey budur:

Bu durumlarda, işlevinizin altına anlamlı bir dönüş değeri (true gibi) veya boş olarak ekleyerek , anlama sonuçlarını yanlışlıkla döndürmediğinizden emin olun .


Ancak bunun gibi bir paketleyici yazabilirsiniz:

voidFun = (fun) ->
    ->
        fun(arguments...)
        return

( Buradaki uyarı operatörüne dikkat edin ( ...))

Ve fonksiyonları tanımlarken şu şekilde kullanın:

fun = voidFun ->
    doSomething()
    doSomethingElse()

Veya bunun gibi:

fun = voidFun(->
    doSomething()
    doSomethingElse()
)

Bu bilgilendirici cevap için teşekkür ederim. Ben de şu anda kahve kitabını öğrenirken bunu merak ediyordum. Merak ediyorum, en iyi seçeneğin ne olduğuna veya bir değerin geri dönüşünü önlerken en kötü seçimin ne olduğuna biraz ışık tutabilir misiniz? Özellikle, seçenekleri ya eklemek edilir söylendi return, undefinedya nullbenim fonksiyonun sonuna kadar. Ancak eklemek nullbazı nedenlerden dolayı bana yanlış geliyor. Üçü arasında en kötü seçim olduğunu varsaymakta haklı mıyım?
stefmikhail

2
JavaScript'te, return ifadesi olmayan bir işlev (veya boş bir dönüş ifadesi) tanımsız döndürür, bu nedenle en iyi seçenek ya boş bir dönüş eklemek ya undfinedda sonunda bir bırakmaktır . Boş bir returnifade kullanmak , işlevin sonunda bir bırakmaktan daha iyi bir şey ifade etmiyor gibi görünüyor undefined, bu nedenle boş returndaha iyi bir seçenek gibi görünüyor.
Arnaud Le Blanc

2
Bunun yerine fun(arguments...)aramak daha iyi olur fun.apply(this, arguments).
Miguel Madero

4
Aslında, "dönüş" ve "tanımlanmamış" farklı javascript oluşturur. Coffeescript.org adresindeki "Try Coffeescript" i kullanarak, kahveye açıkça "return" eklemenin javascript'ten geri dönüşü ortadan kaldırdığı görülebilir; oysa, "tanımsız" ile, javascript işlevi "return void 0" ile biter;
Daniel

1
VoidFun konusunda dikkatli olmanız gerekebileceğini düşünüyorum çünkü iç işlevin yine de istediği her şeyi döndüreceğinden şüpheleniyorum ki bu muhtemelen performans düşüşüne neden olabilir.
AturSams

10

Evet, bir return bir işlevin son satırı olarak a.

Örneğin,

answer = () ->
  42

extrovert = (question) -> 
  answer()

introvert = (question) ->
  x = answer()
  # contemplate about the answer x
  return 

Kahvenin neye derlendiğini görmek isterseniz, http://bit.ly/1enKdRl'yi deneyin . (Örneğim için kahve reçetesi redux kullandım)


1
Sanırım olumsuz oy verildi çünkü bu cevap zaten en çok oylanan cevapta bulunan ve bundan 2 yıl önce verilmiş olan cevaptan başka bir değer katmıyor!
kumarharsh

5

Sadece eğlenceli bir şey (kurgusal)

suppressed = _.compose Function.prototype, -> 'do your stuff'

Function.prototypekendisi her zaman hiçbir şey döndürmeyen bir işlevdir. Dönüş değerinizi bu kara deliğe yönlendirmek için compose kullanabilirsiniz ve oluşturulan işlev hiçbir zaman hiçbir şey döndürmez.


1
longRunningFunctionWithNullReturn = ->
  longRunningFunction()
  null

-1

Görünüşe göre CoffeeScript'teki işlevler her zaman bir şey döndürmelidir null. C'de, voiddönüş türünüz var. ->, boş işlev için derlenir (function() {}), dolayısıyla hiçbir şey döndürmeyen tek işlevdir.


Bu doğru değil. return;bir void değeri döndürmek için C, JavaScript ve CoffeeScript'te çalışır.
yyny
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.