Ternäre Operation in CoffeeScript

318

Ich muss einen Wert festlegen a, der von einer Bedingung abhängt.

Was ist der kürzeste Weg, dies mit CoffeeScript zu tun?

So würde ich es beispielsweise in JavaScript machen:

a = true  ? 5 : 10  # => a = 5
a = false ? 5 : 10  # => a = 10
evfwcqcg
quelle
120
<rant> Ich wünschte, das Kaffeeskript hätte gerade die Syntax des ternären Operators unterstützen können. Es ist kürzer und einfacher zu lesen als if else then </ rant>
AJP
2
@AJP Ich denke, das Ternäre würde Kaffee weniger Ruby-ish machen, obwohl Ruby das hat. Das Ziel beim Kaffee ist immer die Lesbarkeit und das Abrunden rauer Ecken.
JCollum
37
@jcollum stimmte zu, aber was ich wirklich am beunruhigendsten finde, ist, dass a = true ? 5 : 10es sich um gültiges Kaffeeskript handelt, aber keine ternäre Struktur bedeutet, sondern (in Javascript) bedeutet: a = true ? true : {5:10}was als schlechte Sache bekannt ist® Zusätzlich ist es dann a = false ? {5 : 10}in Coffeescript (in Javascript) Äquivalent zu: a = true ? false : {5:10} Für das, was es wert ist, finde ich es nicht gut.
AJP
2
Es kann am besten sein, wenn ... dann ... für CoffeeScript. Das ? als Existenzoperator macht viel Sinn: beast = yeti ? "bear"oder if yeti? then alert "It's a yeti!"macht das ?ganz gut.
Paul Oliver
3
Ein separater ternärer Operator ist in CoffeeScript nicht unbedingt erforderlich, da dies if/then/elsebereits ein Ausdruck ist und dasselbe tut. Wenn Sie es wirklich vermissen, sind Sie eher an die C- oder JavaScript-Syntax gewöhnt, als dass Sie es wirklich brauchen. Wenn es nicht lesbar genug ist und es manchmal vorkommt, setzen Sie einfach den gesamten Ausdruck in Klammern. Der Operator ?wurde von nützlicheren Überprüfungen verschont, die in JavaScript fehlen, wie bereits von @PaulOliver angegeben. Existenzieller Operator ist der beste.
Skalee

Antworten:

544

Da alles ein Ausdruck ist und somit zu einem Wert führt, können Sie ihn einfach verwenden if/else.

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

Weitere Informationen zu Ausdrucksbeispielen finden Sie hier .

loganfsmyth
quelle
8
Ich denke, es gibt einen Grund für Coffeescript, die ternäre Javascript-Standardsyntax nicht zu unterstützen.
Augustin Riedinger
41
Der Grund ist die Präferenz des Erstellers für etwas "weniger Kryptisches" und weniger Willkürliches (z . B. github.com/jashkenas/coffeescript/issues/11#issuecomment-97802 ). [Meine 2 Cent - Während ich die Willkür von?: Erkenne, denke ich, dass dies if..then..elseein zu ausführlicher Ersatz für das ist, was ein prägnanter Ausdruck sein soll. Und ?: Ist immerhin ein sehr tief verwurzelter Standard in vielen Sprachen, darunter auch JavaScript. Ungeachtet dessen scheint es zu diesem Zeitpunkt in Stein gemeißelt zu sein.]
Mahemoff
1
Ich stimme dem CoffeeScript-Autor zu, ich fand die ternäre Syntax immer hässlich und nicht intuitiv AF. Wenn Sie if then elsein derselben Zeile verwenden können, sind es 7 zusätzliche Zeichen für viel mehr Klarheit und Eleganz.
Joshua Pinter
Hängt vom Geschmack ab, aber ich habe eine starke Präferenz für Symbole gegenüber Schlüsselwörtern, wie z. B. ->über functionoder { }über begin .. end, weil ich ein hohes Signal-Rausch-Verhältnis sehen möchte, bei dem die Wörter für funktionsspezifische Logik reserviert sind und die Betriebslogik größtenteils verbannt ist zu Symbolen.
Mahemoff
Das gesamte Bestreben, sehr standardmäßige sprachübergreifende Strukturen zu entfernen, schraubt nur Leute, die Wartungsarbeiten durchführen, besonders wenn Sie andere 'hilfreiche' Dinge wie Mops hinzufügen ... Wenn Sie nicht alle Argumentsequenzen und Geisterklammern ableiten können ...
Grunion Shaftoe
68
a = if true then 5 else 10
a = if false then 5 else 10 

Siehe Dokumentation .

Paul Oliver
quelle
21

In fast jeder Sprache sollte dies stattdessen funktionieren:

a = true  && 5 || 10
a = false && 5 || 10
Alexander Senko
quelle
38
Dies funktioniert, ist aber weitaus weniger klar und es gibt keinen Grund, dies in einer Sprache zu tun, die eine bessere Syntax dafür hat.
Ibrahim
10
Es ist in vielen Sprachen nicht gleichwertig, in denen falseWerte wie 0, null, undefiniert usw. implizit konvertiert werden
Lord of the Goo
12
@Ibrahim Dies funktioniert nur dann als bedingter Ternär , wenn der Teil nach der &&Markierung wahr ist, andernfalls würde der letzte Teil zurückgegeben, so wie bedingte Ternäre nicht funktionieren.
Pepkin88
Genau der Unterschied! :)
Pierre Voisin
Von allen Beispielen ist dies das schwierigste, um zu sagen, welche Variablen in einer bestimmten Sprache vorkommen, auf die ich stoßen könnte - insbesondere eine Sprache wie CoffeeScript (oder Ruby), in der Leerzeichen nicht immer Leerzeichen sind
Toni Leigh
12

Coffeescript unterstützt keinen ternären Javascript-Operator. Hier ist der Grund vom Coffeescript-Autor :

Ich liebe ternäre Operatoren genauso wie den nächsten (wahrscheinlich ein bisschen mehr), aber die Syntax macht sie nicht gut - sie sind großartig, weil sie ein if / else in eine einzelne Zeile einfügen können Ausdruck.

Ihre Syntax ist nur ein weiteres Stück mystifizierender Magie, das man sich merken kann, ohne Analogie zu irgendetwas anderem in der Sprache. Da das Ergebnis gleich ist, hätte ich es viel lieberif/elses immer gleich ausgesehen (und immer zu einem Ausdruck zusammengefasst).

In CoffeeScript werden sogar mehrzeilige ifs bei Bedarf zu ternären Kompilierungen kompiliert, ebenso wie if-Anweisungen ohne else-Klausel:

if sunny   
  go_outside() 
else   
  read_a_book().

if sunny then go_outside() else read_a_book()

Beide werden ternär, beide können als Ausdrücke verwendet werden. Es ist konsistent und es gibt keine neue Syntax zu lernen. Also, danke für den Vorschlag, aber ich schließe dieses Ticket als "wontfix".

Weitere Informationen finden Sie im Github-Problem: https://github.com/jashkenas/coffeescript/issues/11#issuecomment-97802

Max Peng
quelle
3

Sie können es auch in zwei Anweisungen schreiben, wenn es meistens wahr ist:

a = 5
a = 10 if false

Oder verwenden Sie eine switch-Anweisung, wenn Sie weitere Möglichkeiten benötigen:

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

Mit einem Booleschen Wert kann es übergroß sein, aber ich finde es sehr lesbar.

Alinex
quelle
1

Mehrzeilige Version (z. B. wenn Sie nach jeder Zeile einen Kommentar hinzufügen müssen):

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

CoffeeScripthat keinen ternären Operator. Das sagen die Dokumente.

Sie können weiterhin eine Syntax wie verwenden

a = true then 5 else 10

Es ist viel klarer.

Эд Лесничий
quelle