CoffeeScript'te üçlü çalışma


318

Ben abir koşula bağlı olarak değer ayarlamak gerekir .

CoffeeScript ile bunu yapmanın en kısa yolu nedir?

Örneğin ben JavaScript bunu şöyle yaparım:

a = true  ? 5 : 10  # => a = 5
a = false ? 5 : 10  # => a = 10

120
<rant> Kahve betiğinin üçlü operatör sözdizimini desteklemesini isterdim, okumaktan daha kısa ve daha kolay if else then </rant>
AJP

2
@AJP Sanırım üçlü, Ruby'ye sahip olmasına rağmen kahveyi Ruby-ish daha az yapacaktı. Kahve ile amaç her zaman okunabilirlik ve pürüzlü köşeleri yuvarlamaktır.
jcollum

37
@jcollum kabul etti, ama gerçekten bunu en rahatsız edici ne bulmak a = true ? 5 : 10geçerli CoffeeScript olmakla (javascript) bir üçlü yapı yerine gelmez bu demektir: a = true ? true : {5:10}Ayrıca thing® kötü olarak bilinen a = false ? {5 : 10}olduğu (javascript) daha sonra CoffeeScript içinde Buna değer: Bunun a = true ? false : {5:10} için iyi olduğunu düşünmüyorum.
AJP

2
CoffeeScript için ..se ...seçmek en iyisi olabilir. ? bir varlık olarak operatör çok mantıklıdır: beast = yeti ? "bear"ya if yeti? then alert "It's a yeti!"da ?oldukça iyi kullanır.
Paul Oliver

3
CoffeeScript'te ayrı bir üçlü operatör gerçekten if/then/elsebir ifade olduğu ve aynı şeyi yaptığı gibi gerekli değildir . Gerçekten kaçırıyorsanız, gerçekten ihtiyacınız olandan ziyade C veya JavaScript sözdizimine alışkınsınız. Yeterince okunamıyorsa ve bazen gerçekleşiyorsa, tüm ifadeyi parantez içine sarın. Operatör ?, @PaulOliver tarafından daha önce belirtildiği gibi, JavaScript'te bulunmayan daha yararlı denetimlerden kurtuldu. Varoluşçu operatör en iyisidir.
skalee

Yanıtlar:


544

Her şey bir ifade olduğundan ve bu nedenle bir değerle sonuçlandığından, sadece kullanabilirsiniz if/else.

a = if true then 5 else 10
a = if false then 5 else 10

İfade örnekleri hakkında daha fazla bilgiyi burada bulabilirsiniz .


8
Kahvenin javascript varsayılan üçlü sözdizimini desteklememesinin bir nedeni var sanırım?
Augustin Riedinger

41
Bunun nedeni, içerik oluşturucunun "daha az şifreli" ve daha az keyfi bir şey (ör . Github.com/jashkenas/coffeescript/issues/11#issuecomment-97802 ) tercihidir . [My 2 sent - Ben keyfilik fark ederken:? Bence if..then..elseözlü bir ifadesi olması gerekiyordu ne için bir yedek ayrıntılı too. Ve?: Sonuçta birçok dil arasında çok köklü bir standart, aralarında JavaScript. Tüm bunlara rağmen, bu aşamada taşa yerleştirilmiş gibi görünüyor.]
mahemoff

1
CoffeeScript yazarına katılıyorum, her zaman üçlü sözdiziminin çirkin ve sezgisel olmayan AF olduğunu düşündüm. if then elseAynı satırda kullanabiliyorsanız , bunu yapın, daha fazla netlik ve şıklık için 7 ek karakter.
Joshua Pinter

Tat bağlıdır, ama ben gibi anahtar kelimeler üzerinde semboller, güçlü bir tercihi ->üzerinde functionveya { }üzerinde begin .. endben kelime fonksiyonu özgü mantığı için ayrılmıştır ve operasyonel mantık çoğunlukla havale edilmiş gürültü oranı, yüksek bir sinyal görmek ister çünkü, sembollere.
mahemoff

Çok standart çapraz dil yapılarını kaldırmak için tüm sürüş gerçekten bakım yapan insanları, özellikle de pug gibi diğer 'yararlı' şeyleri eklediğinizde vidalar ... Tüm argüman dizilerini ve hayalet parantezlerini çıkartamazsanız ...
Grunion Shaftoe


21

Hemen hemen her dilde bunun yerine çalışması gerekir:

a = true  && 5 || 10
a = false && 5 || 10

38
Bu işe yarıyor, ancak çok daha az net ve bunu daha iyi bir sözdizimine sahip herhangi bir dilde yapmak için hiçbir neden yok.
İbrahim

10
false0, null, undefined, vb. Gibi değerlere örtük dönüştürmenin olduğu birçok dilde eşdeğer değildir
Goo Lordu

12
@Ibrahim Bu koşullu bir üçlü olarak çalışır, ancak&& işaretten sonraki kısım doğruysa, aksi takdirde koşullu üçlülerin nasıl çalıştığı değil, son parçayı döndürür.
pepkin88

Kesinlikle, fark! :)
Pierre Voisin

tüm örneklerden, bu, karşılaşabileceğim herhangi bir dilde değişkenlerin ne olduğunu söylemek için en zor bulacağım - özellikle boşlukların her zaman boşluk olmadığı CoffeeScript (veya Ruby) gibi bir dil
Toni Leigh

12

Coffeescript javascript üçlü operatörünü desteklemez . Kahve yazarı yazarının nedeni :

Üçlü operatörleri bir sonraki adam kadar seviyorum (muhtemelen biraz daha, aslında), ancak sözdizimi onları iyi yapan şey değil - harika çünkü tek bir satıra bir if / else sığdırabilirler. ifadesi.

Sözdizimleri, dilde başka hiçbir şeye benzemeyen, ezberlemek için gizemli bir sihirden başka bir şey. Sonuç eşit olduğunda, if/elsesher zaman aynı görünmeyi tercih ederim (ve her zaman bir ifadeye derlenmeliyim).

Bu nedenle, CoffeeScript'te, çok satırlı ifs bile uygun olduğunda üçlüye derlenecek, başka bir cümle içermeyen ifadeler gibi:

if sunny   
  go_outside() 
else   
  read_a_book().

if sunny then go_outside() else read_a_book()

Her ikisi de üçlü olur, her ikisi de ifade olarak kullanılabilir. Tutarlı ve öğrenilecek yeni bir sözdizimi yok. Yani, öneri için teşekkürler, ama bu bilet "alışkanlık" olarak kapatıyorum.

Lütfen github sorununa bakın: https://github.com/jashkenas/coffeescript/issues/11#issuecomment-97802


3

Çoğunlukla doğru kullanım ise iki ifadeyle de yazabilirsiniz:

a = 5
a = 10 if false

Veya daha fazla olasılığa ihtiyacınız varsa bir anahtar ifadesi kullanın:

a = switch x
  when true then 5
  when false then 10

Bir boole ile büyük boy olabilir ama çok okunabilir buluyorum.


1

Çok satırlı sürüm (örneğin, her satırdan sonra yorum eklemeniz gerekiyorsa):

a = if b # a depends on b
then 5   # b is true 
else 10  # b is false

0

CoffeeScriptüçlü operatör yok. Dokümanlar böyle söylüyor.

Hâlâ gibi bir sözdizimi kullanabilirsiniz

a = true then 5 else 10

Çok daha net.

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.