Operacja trójskładnikowa w CoffeeScript

318

Muszę ustawić wartość, aktóra zależy od warunku.

Jaki jest najkrótszy sposób, aby to zrobić za pomocą CoffeeScript?

Np. Tak zrobiłbym to w JavaScript:

a = true  ? 5 : 10  # => a = 5
a = false ? 5 : 10  # => a = 10
evfwcqcg
źródło
120
<rant> Chciałbym, aby skrypt kawy mógł po prostu obsługiwać składnię operatora trójskładnikowego, jest krótszy i łatwiejszy do odczytania niż if else then </rant>
AJP
2
@AJP Myślę, że trójka sprawiłaby, że kawa nie byłaby rubinowa, mimo że Ruby to ma. Celem kawy jest zawsze czytelność i zaokrąglanie trudnych zakrętów.
jcollum
37
@jcollum zgodził się, ale najbardziej niepokojące jest to, że a = true ? 5 : 10jest to prawidłowy skrypt coffeescript, ale nie oznacza on struktury trójskładnikowej, zamiast tego (w javascript) oznacza to: a = true ? true : {5:10}co jest znane jako zła rzecz. Dodatkowo a = false ? {5 : 10}w coffeescript (w javascript) odpowiednik: a = true ? false : {5:10} za to, co jest warte, nie sądzę, aby było dobre.
AJP 17.01.13
2
Najlepiej może się przeliterować, jeśli… następnie… wybierz dla CoffeeScript. The? jako operator istnienie sprawia, że wiele sensu: beast = yeti ? "bear"lub if yeti? then alert "It's a yeti!"marki użyć ?całkiem dobrze.
Paul Oliver,
3
Oddzielny operator trójskładnikowy nie jest tak naprawdę konieczny w CoffeeScript, ponieważ if/then/elsejest już wyrażeniem i robi to samo. Jeśli naprawdę tego brakuje, to raczej przyzwyczajasz się do składni C lub JavaScript, niż naprawdę jej potrzebujesz. Jeśli nie jest wystarczająco czytelny, a czasem się zdarza, po prostu zawiń całe wyrażenie w nawiasach. ?Oszczędzono operatorowi bardziej przydatne kontrole, których nie ma w JavaScript, jak już stwierdził @PaulOliver. Operator egzystencjalny jest najlepszy.
skalee

Odpowiedzi:

544

Ponieważ wszystko jest wyrażeniem, a tym samym daje wartość, możesz po prostu użyć if/else .

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

Więcej informacji o przykładach wyrażeń można znaleźć tutaj .

loganfsmyth
źródło
8
Wydaje mi się, że istnieje powód, dla którego coffeescript nie obsługuje domyślnej składni trójskładnikowej javascript?
Augustin Riedinger
41
Powodem jest preferowanie przez twórcę czegoś „mniej tajemniczego” i mniej arbitralnego (np. Github.com/jashkenas/coffeescript/issues/11#issuecomment-97802 ). [Moje 2 centy - chociaż zdaję sobie sprawę z arbitralności?: Myślę, że if..then..elsejest zbyt szczegółowe, zastępuje to, co ma być zwięzłym wyrażeniem. A?: Jest przecież bardzo zakorzenionym standardem wśród wielu języków, w tym JavaScript. Mimo to wydaje się, że na tym etapie jest on osadzony w kamieniu.]
mahemoff
1
Zgadzam się z autorem CoffeeScript, zawsze myślałem, że trójskładnikowa składnia to brzydki i nieintuicyjny AF. Jeśli możesz używać if then elsetej samej linii, zrób to, to 7 dodatkowych znaków dla znacznie większej przejrzystości i elegancji.
Joshua Pinter
Zależy od gustu, ale zdecydowanie wolę symbole od słów kluczowych, np. ->Powyżej functionlub { }powyżej begin .. end, ponieważ lubię widzieć wysoki stosunek sygnału do szumu, w którym słowa są zarezerwowane dla logiki specyficznej dla funkcji, a logika operacyjna jest w większości relegowana do symboli.
mahemoff
Cały wysiłek, aby usunąć bardzo standardowe struktury międzyjęzykowe, naprawdę psuje ludzi, którzy zajmują się konserwacją, szczególnie gdy dodajesz inne „pomocne” rzeczy, takie jak mops ... Jeśli nie możesz wywnioskować wszystkich sekwencji argumentów i nawiasów duchów ...
Grunion Shaftoe
68
a = if true then 5 else 10
a = if false then 5 else 10 

Zobacz dokumentację .

Paul Oliver
źródło
21

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

a = true  && 5 || 10
a = false && 5 || 10
Alexander Senko
źródło
38
To działa, ale jest o wiele mniej jasne i nie ma powodu, aby robić to w dowolnym języku, który ma lepszą składnię.
Ibrahim
10
Nie jest to równoważne w wielu językach, w których zachodzi niejawna konwersja na falsewartości takie jak 0, null, undefined,… i tak dalej
Lord of the Goo
12
@Ibrahim Działa to jako trójskładnik warunkowy tylko wtedy, gdy część po &&znaku jest zgodna z prawdą, w przeciwnym razie zwróci ostatnią część, co nie jest sposobem działania trójskładników warunkowych.
pepkin88
Właśnie różnica! :)
Pierre Voisin
ze wszystkich przykładów najłatwiej jest mi powiedzieć, jakie są zmienne w danym języku, z którym się zetknąłem - zwłaszcza język, taki jak CoffeeScript (lub Ruby), w którym spacje nie zawsze są spacjami
Toni Leigh
12

Coffeescript nie obsługuje trójskładnikowego operatora javascript. Oto powód autora coffeescript :

Uwielbiam operatorów trójskładnikowych tak samo jak następnego faceta (prawdopodobnie trochę więcej), ale składnia nie jest tym, co czyni je dobrymi - są świetne, ponieważ mogą zmieścić if / else w jednym wierszu jako wyrażenie.

Ich składnia jest tylko kolejną tajemniczą magią do zapamiętania, bez analogii do czegokolwiek innego w języku. Ponieważ wynik jest równy, wolałbym raczejif/elses zawsze wyglądać tak samo (i zawsze być skompilowany w wyrażenie).

Tak więc, w CoffeeScript, nawet wieloliniowe ifs będą kompilowane w trójki, gdy będzie to stosowne, podobnie jak instrukcje if bez klauzuli else:

if sunny   
  go_outside() 
else   
  read_a_book().

if sunny then go_outside() else read_a_book()

Oba stają się trójskładnikami, 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 problemu github: https://github.com/jashkenas/coffeescript/issues/11#issuecomment-97802

Max Peng
źródło
3

Możesz również napisać to w dwóch instrukcjach, jeśli jest to w większości przypadków prawdziwe użycie:

a = 5
a = 10 if false

Lub użyj instrukcji switch, jeśli potrzebujesz więcej możliwości:

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

Z boolean może być zbyt duży, ale uważam, że jest bardzo czytelny.

Alinex
źródło
1

Wersja wielowierszowa (np. Jeśli musisz dodać komentarz po każdym wierszu):

a = if b # a depends on b
then 5   # b is true 
else 10  # b is false
quotesBro
źródło
0

CoffeeScriptnie ma operatora trójskładnikowego. Tak mówią doktorzy.

Nadal możesz używać podobnej składni

a = true then 5 else 10

To o wiele wyraźniejsze.

Эд Лесничий
źródło