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

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 .


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


21

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

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

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


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.


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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.