Wie wird der bedingte Operator ( ? :
) in Ruby verwendet?
Ist das zum Beispiel richtig?
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
ruby
ternary-operator
conditional-operator
Mithun Sreedharan
quelle
quelle
question=question[0,20]
Wenn es kleiner als 20 wäre, würde es nichts daran ändern.Antworten:
Es ist der ternäre Operator und funktioniert wie in C (die Klammern sind nicht erforderlich). Es ist ein Ausdruck, der funktioniert wie:
In Ruby
if
ist dies jedoch auch ein Ausdruck:if a then b else c end
===a ? b : c
, mit Ausnahme von Vorrangproblemen . Beides sind Ausdrücke.Beispiele:
Beachten Sie, dass im ersten Fall Klammern erforderlich sind (andernfalls ist Ruby verwirrt, weil es denkt, dass es sich
puts if 1
um zusätzlichen Müll handelt), im letzten Fall jedoch nicht, da das Problem nicht auftritt.Sie können das "Long-If" -Formular zur besseren Lesbarkeit in mehreren Zeilen verwenden:
quelle
nil
und die einzigen falschen Wertefalse
. In der Tat nicht sehr üblich.quelle
puts (true ? "true" : "false")
mit Klammern. Andernfalls ist die Reihenfolge der Operationen nicht klar. Als ich dies zum ersten Mal las, war ich verwirrt, als ich es wie(puts true) ? "true" : "false"
erwartet lasputs
, um den Booleschen Wert zurückzugeben, der dann zum Zeichenfolgenwert wurde.Ihre Verwendung von ERB deutet darauf hin, dass Sie sich in Rails befinden. Wenn ja, dann ziehen Sie
truncate
einen eingebauten Helfer in Betracht , der die Arbeit für Sie erledigt:quelle
@pst gab eine großartige Antwort, aber ich möchte erwähnen, dass in Ruby der ternäre Operator in einer Zeile geschrieben ist, um syntaktisch korrekt zu sein, im Gegensatz zu Perl und C, wo wir ihn in mehreren Zeilen schreiben können:
Normalerweise wird Ruby einen Fehler auslösen, wenn Sie versuchen, ihn auf mehrere Zeilen aufzuteilen. Sie können jedoch das
\
Zeilenfortsetzungssymbol am Ende einer Zeile verwenden, und Ruby freut sich:Dies ist ein einfaches Beispiel, aber es kann sehr nützlich sein, wenn Sie mit längeren Zeilen arbeiten, da der Code übersichtlich bleibt.
Es ist auch möglich, das Ternär ohne die Zeilenfortsetzungszeichen zu verwenden, indem die Operatoren als letzte in die Zeile gesetzt werden, aber ich mag oder empfehle es nicht:
Ich denke, das führt zu sehr schwer lesbarem Code, da der bedingte Test und / oder die Ergebnisse länger werden.
Ich habe Kommentare gelesen, in denen es heißt, den ternären Operator nicht zu verwenden, weil er verwirrend ist, aber das ist ein schlechter Grund, etwas nicht zu verwenden. Nach der gleichen Logik sollten wir keine regulären Ausdrücke, Bereichsoperatoren ('
..
' und die scheinbar unbekannte "Flip-Flop" -Variante) verwenden. Sie sind mächtig, wenn sie richtig verwendet werden, daher sollten wir lernen, sie richtig zu verwenden.Betrachten Sie das Beispiel des OP:
Durch das Umschließen des bedingten Tests wird die Lesbarkeit verbessert, da der Test visuell getrennt wird:
Natürlich könnte das gesamte Beispiel durch einige vernünftige Ergänzungen von Leerzeichen viel lesbarer gemacht werden. Dies ist nicht getestet, aber Sie werden auf die Idee kommen:
Oder idiomatischer geschrieben:
Es wäre leicht zu argumentieren, dass die Lesbarkeit ebenfalls stark darunter leidet
question.question
.quelle
true
?true
sitzt eigentlich für was wäre ein Ausdruck, der zutrue
oder auswertetfalse
. Es ist besser, diese visuell abzugrenzen, da sich ternäre Anweisungen schnell in visuelles Rauschen verwandeln können, wodurch die Lesbarkeit verringert wird, was sich auf die Wartbarkeit auswirkt.Ein einfaches Beispiel, bei dem der Bediener prüft, ob die ID des Spielers 1 ist, und die ID des Feindes abhängig vom Ergebnis festlegt
Und ich habe einen Beitrag zum Thema gefunden, der ziemlich hilfreich erscheint.
quelle
enemy_id = player_id == 1 ? 2 : 1
?Der Code
condition ? statement_A : statement_B
entsprichtquelle
Einfachster Weg:
da
param_a
ist nicht gleichparam_b
dann wird derresult
Wert von 'seinNot same!
quelle