Bedingter Operator in Coffeescript

74

Das gefällt mir wirklich gut:

var value = maxValue > minValue ? minValue : maxValue;

Gibt es etwas ebenso Prägnantes in Coffescript?

Blub
quelle
8
Vielen Dank, dass Sie es nicht "den ternären Operator" nennen.
Mark Wilden
4
@ MarkWilden warum sollte er nicht? Es ist eine etablierte Amtszeit
Stephan
1
Wenn Sie nach einem ternären Operator für Coffescript suchen, finden Sie ihn sofort.
William.eyidi
@MarkWilden: Du hast 5 Upvotes, also scheinen einige Leute dir zuzustimmen, aber würdest du bitte erklären, warum?
Zaz
3
"Das Problem mit 'dem ternären Operator' ist, dass es beschreibt, wie es aussieht, nicht was es tut. " - Eric Lippert, blogs.msdn.com/b/ericlippert/archive/2010/02/18/… (in die Kommentare)
Joe White

Antworten:

140
value = if maxValue > minValue then minValue else maxValue
Tim Cooper
quelle
10
Sie können dies auch tun: value = `maxValue > minValue ? minValue : maxValue`
Peter Krnjevic
1
@PeterKrnjevic: Vielleicht möchten Sie Ihren Kommentar in eine Antwort ändern :) Bei gleicher Anzahl von Zeichen, aber meiner Meinung nach weniger lesbar, funktioniert dies auch: stackoverflow.com/a/23915351/750216
Răzvan Flavius ​​Panda
1
Wenn Sie denken, die richtige Lösung ist:value = Math.min minValue, maxValue
Raskhadafi
Okay, wie schreibt man das jetzt in mehreren Zeilen? Eine andere Möglichkeit als die Verwendung des Zeilenfortsetzungszeichens ``?
Jimasun
21

Es gibt eine weitere knappe Option sowohl in Javascript und Coffeescript :)

value = Math.min(minValue, maxValue)
Ricardo Tomasi
quelle
12
in Kaffee , value = Math.min minValue, maxValue;)
v42
4
Ich glaube nicht, dass sich die Frage auf den tatsächlichen Inhalt bezog, sondern auf die Fähigkeit, alles in einer Zeile zu erledigen. Könnte aber falsch sein.
LasagneAndroid
1
Falsch, da es die Frage nicht anspricht. Das OP fragt Conditional operator in Coffeescriptnach dem JSBeispiel und wie man es schreibt . Es ist nur ein Beispiel und hat nichts mit dem eigentlichen Syntaxproblem zu tun.
Jimasun
12

Wie Răzvan Panda betont, könnte mein Kommentar tatsächlich eine der besseren Antworten sein:

value = `maxValue > minValue ? minValue : maxValue`
Peter Krnjevic
quelle
Welche Funktion haben die Anführungszeichen in Ihrer Codezeile?
Mathieu Brouwers
Die Backticks bewirken, dass die Zeile vor der Zuweisung ausgeführt wird.
Peter Krnjevic
10

Dies ist ein Fall, in dem es sich anfühlt, als hätte CoffeeScript konkurrierende Philosophien:

  1. Sei präzise
  2. Sei nicht überflüssig

Da alle Operationen ein Ergebnis zurückgeben, gibt Ihnen die if / then / else-Vorgehensweise das, was Sie benötigen. Das Hinzufügen des Operators? /: Ist redundant.

Hier wünschte ich mir, sie würden uns den ternären Operator? /: Geben, obwohl er redundant ist ... er liest sich einfach besser als die if / then / else-Variante.

Nur mein 2c.

Brian Genisio
quelle
20
Es gibt keine Möglichkeit, das a ? b : cTernär in CoffeeScript ohne Mehrdeutigkeit zu haben, da a ? bes eine Bedeutung hat (" awenn es nicht null ist, bsonst) und b: cauch eine ( {b: c}).
Trevor Burnham
3

Sie können es so schreiben:

value = if maxValue > minValue then minValue else maxValue

Es wird wie Ihr Code kompiliert.

v42
quelle
3

Unten ist die Tatsache:

In der Dokumentation gibt es einen Abschnitt mit dem Titel "Bedingungen, Ternäre und bedingte Zuweisung" . Dies lässt vermuten, dass Coffeescript unterstützt

condition ? when-true : when-false 

aber in der Tat nicht.

Unten finden Sie Informationen zu dem Patch, mit dem dieses Problem behoben werden kann

Hier ist der Patch (und er wird an coffeescript.org gesendet ):

http://github.com/jashkenas/coffee-script/commit/ec2d358ae3c82e9888c60695d7cce05edde0c55a

Beispiele:

mood = greatlyImproved if singing

if happy and knowsIt
  clapsHands()
  chaChaCha()
else
  showIt()

date = if friday then sue else jill

options or= defaults
Siva Charan
quelle
2
if then else ist eine ternäre Operation, sie hat nur eine andere Syntax.
Ricardo Tomasi
im Kaffeeskript, wenn die Anweisung else in einer einzeiligen Anweisung geschrieben ist.
Siva Charan
1
Was ich damit gemeint habe ist, dass eine ternäre Operation als eine Operation mit drei Elementen definiert ist . Eine einzeilige if then elseAnweisung wird als ternär klassifiziert . Der korrekte Begriff für den "ternären" Operator in Javascript ist ohnehin ein bedingter Operator .
Ricardo Tomasi
-1
value = maxValue > minValue && minValue || maxValue

Dies ist eigentlich nicht korrekt, überprüfen Sie die Kommentare.

Sergey Semenov
quelle
1
Dies gibt keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klarstellung zu bitten, hinterlassen Sie einen Kommentar unter seinem Beitrag.
PlasmaHH
@PlasmaHH: Dies ist eine gültige Antwort, nur ein wenig weniger lesbar.
Răzvan Flavius ​​Panda
1
@ RăzvanPanda Nein, es ist keine gültige Antwort, da es etwas anderes tut als angefordert und der Unterschied in der Antwort nicht beschrieben / dokumentiert ist. Z.B. Wenn minValuegleich 0und maxValuegleich 5, dann maxValue > minValue ? minValue : maxValuewürde zurückkehren 0, während zurückkehren maxValue > minValue && minValue || maxValuewürde 5.
pepkin88
@ pepkin88: Das ist richtig, diese Antwort funktioniert nicht, wenn ein falscher Wert für minValue übergeben wird und die Bedingung wahr ist.
Răzvan Flavius ​​Panda