2012-04-13 23 views
290

Potrzebuję ustawić wartość na a, która zależy od warunku.Praca trójskładnikowa w CoffeeScript

Jaki jest najkrótszy sposób na zrobienie tego przy pomocy CoffeeScript?

E.g. to jak bym to zrobić w JavaScript:

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

możliwe duplikat (http://stackoverflow.com/questions/8170468/conditional-operator-in-coffeescript) –

+115

Szkoda, że ​​skrypt do kawy nie wspierał składni potrójnego operatora, jest krótszy i łatwiejszy do odczytania niż "jeśli jeszcze to" AJP

+0

Boo. To nie jest dobre. Ternaries może czasem być miłe. –

Odpowiedz

487

ponieważ wszystko jest wyrażeniem, a tym samym prowadzi do wartości, można po prostu użyć if/else.

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

można dowiedzieć się więcej o przykłady ekspresji here.

+6

Sądzę, że istnieje powód, dla którego coffeescript nie obsługuje domyślnej składni potrójnej javascript? –

+30

Powodem jest preferencja twórcy do czegoś "mniej tajemniczego" i mniej arbitralnego (np. Https://github.com/jashkenas/coffeescript/issues/11#issuecomment-97802). [Moje 2 centy - Chociaż zdaję sobie sprawę z arbitralności?:, Myślę, że 'if..then..else' jest zbyt obszernym zamiennikiem tego, co ma być zwięzłym wyrażeniem. I?: Jest przecież bardzo zakorzenionym standardem wśród wielu języków, między innymi JavaScript. Niezależnie od wszystkiego, wydaje się, że na tym etapie jest on zamknięty.] – mahemoff

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

Zobacz documentation.

+8

@MattHumphrey 200 upvotes = 2000 rep – Stephan

22

W prawie każdym języku to powinno działać zamiast:

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

To działa, ale jest znacznie mniej jasne i nie ma powodu, aby robić to w dowolnym języku, który ma lepszą składnię do niego . – Ibrahim

+8

To nie jest równoważne w wielu językach, gdzie jest niejawna konwersja do 'false' wartości takich jak 0, null, undefined, ... i tak dalej na –

+9

@Ibrahim To działa jako warunkowe Ternary ** tylko ** jeśli część po' && ' znak jest prawdą, w przeciwnym razie zwróciłby ostatnią część, co nie działa jak warunkowe trójkomorały. – pepkin88

3

Możesz także napisać go w dwóch sprawozdaniach, jeśli to przeważnie jest prawdziwe przeznaczenie:

a = 5 
a = 10 if false 

Albo użyć instrukcji switch, jeśli trzeba więcej możliwości:

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

Z boolowskim może być przewymiarowany, ale uważam go za bardzo czytelny.

10

Coffeescript nie obsługuje potrójnego operatora javascript. Oto powód od autora coffeescript:

Kocham operatorów trójskładnikowych tak samo jak kolejnego faceta (chyba trochę więcej, faktycznie), ale składnia nie jest to, co sprawia, że ​​są dobre - - są świetne, ponieważ mogą pasować do/else w jednym wierszu jako wyrażenie .

Ich składnia jest po prostu kolejną odrobiną tajemniczej magii do zapamiętania, z nie jest analogiczna do niczego innego w tym języku. Wynik jest równy, Wolałbym, aby if/elses zawsze wyglądał tak samo (i zawsze byłby wkompilowany w wyrażenie).

Więc w coffeescript nawet IFS obsługujący kilka linii zostanie skompilowany do ternaries w stosownych przypadkach, jak woli if bez klauzuli else:

if sunny 
    go_outside() 
else 
    read_a_book(). 

if sunny then go_outside() else read_a_book() 

Zarówno stać ternaries, oba mogą być używane jako wyrażenia. Jest spójny i nie ma nowej składni do nauki. Dziękuję za sugestię, ale zamykam ten bilet jako "wontfix".

Proszę odnieść się do kwestii github: https://github.com/jashkenas/coffeescript/issues/11#issuecomment-97802

0

wersji Wielowierszowy (npjeśli chcesz dodać komentarz po każdym wierszu): [? warunkowy operatora coffeescript]

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