Ruby verwendet stattdessen den case
Ausdruck .
case x
when 1..5
"It's between 1 and 5"
when 6
"It's 6"
when "foo", "bar"
"It's either foo or bar"
when String
"You passed a string"
else
"You gave me #{x} -- I have no idea what to do with that."
end
Ruby vergleicht das Objekt in der when
Klausel mit dem Objekt in der case
Klausel unter Verwendung des ===
Operators. Zum Beispiel 1..5 === x
und nicht x === 1..5
.
Dies ermöglicht ausgefeilte when
Klauseln, wie oben gezeigt. Bereiche, Klassen und alle möglichen Dinge können nicht nur auf Gleichheit geprüft werden.
Im Gegensatz zu switch
Aussagen in vielen anderen Sprachen hat Ruby's case
keinen Durchfall , sodass es nicht erforderlich ist, jede when
mit einem zu beenden break
. Sie können auch mehrere Übereinstimmungen in einer einzigen when
Klausel wie angeben when "foo", "bar"
.
when
undreturn
in dieselbe Zeile setzen:when "foo" then "bar"
switch
Aussagen in vielen anderen Sprachen, Rubyscase
nicht über Durchfall , so gibt es keine Notwendigkeit , an jedem zu Endewhen
mit einembreak
.then
. Bitte beachten Sie auch die anderen Antworten.case...when
verhält sich beim Umgang mit Klassen etwas unerwartet. Dies liegt an der Tatsache, dass der===
Operator verwendet wird.Dieser Operator arbeitet erwartungsgemäß mit Literalen, jedoch nicht mit Klassen:
Dies bedeutet, dass
case ... when
dies nicht funktioniert , wenn Sie die Klasse eines Objekts überschreiben möchten :Gibt "Es ist keine Zeichenfolge oder Zahl" aus.
Glücklicherweise ist dies leicht zu lösen. Der
===
Operator wurde so definiert, dass er zurückgegeben wird,true
wenn Sie ihn mit einer Klasse verwenden und eine Instanz dieser Klasse als zweiten Operanden angeben:Kurz gesagt, der obige Code kann behoben werden, indem Folgendes entfernt wird
.class
:Ich bin heute auf dieses Problem gestoßen, als ich nach einer Antwort gesucht habe, und dies war die erste Seite, die angezeigt wurde. Daher dachte ich, dass dies für andere in derselben Situation nützlich sein würde.
quelle
.class
ist interessant festzustellen, dass die Rolle dabei ist, danke. Natürlich ist dies ein völlig angemessenes Verhalten (obwohl ich sehen konnte, dass es ein häufiger Fehler ist, zu glauben, dass es gedruckt wirdIt is a string
) ... Sie testen die Klasse eines beliebigen Objekts, nicht das Objekt selbst. So zum Beispiel:case 'hello'.class when String then "String!" when Class then "Class!" else "Something else" end
Ergebnisse in:"Class!"
Dies funktioniert auf die gleiche für1.class
,{}.class
etc. Dropping.class
, wir bekommen"String!"
oder"Something else"
für diese verschiedenen Werte.Dies geschieht
case
in Ruby. Siehe auch " Switch-Anweisung " auf Wikipedia.Zitiert:
Ein anderes Beispiel:
Auf Seite 123 von The Ruby Programming Language (1. Ausgabe, O'Reilly) auf meinem Kindle heißt es, dass das
then
Schlüsselwort nach denwhen
Klauseln durch eine neue Zeile oder ein Semikolon ersetzt werden kann (genau wie in derif then else
Syntax). (Ruby 1.8 erlaubt auch einen Doppelpunkt anstelle vonthen
, aber diese Syntax ist in Ruby 1.9 nicht mehr erlaubt.)quelle
when (-1.0/0.0)..-1 then "Epic fail"
type = #{score}
jede Zeile zu sagen , kann ich einfach kopieren, was Sie getan haben. Viel eleganter mag ich auch die Einzeiler viel besser (wenn möglich)Fall ... wann
Um weitere Beispiele zu Chucks Antwort hinzuzufügen :
Mit Parameter:
Ohne Parameter:
Bitte beachten Sie " Wie schreibe ich eine switch-Anweisung in Ruby ", vor dem kikito warnt.
quelle
or
Viele Programmiersprachen, insbesondere die von C abgeleiteten, unterstützen den sogenannten Switch Fallthrough . Ich suchte nach dem besten Weg, dies auch in Ruby zu tun, und dachte, es könnte für andere nützlich sein:
In C-ähnlichen Sprachen sieht Fallthrough normalerweise so aus:
In Ruby kann dasselbe auf folgende Weise erreicht werden:
Dies ist nicht unbedingt gleichwertig, da es nicht möglich ist
'a'
, einen Codeblock ausführen zu lassen , bevor er zu'b'
oder durchfällt'c'
, aber zum größten Teil finde ich ihn ähnlich genug, um auf die gleiche Weise nützlich zu sein.quelle
In Ruby 2.0 können Sie Lambdas auch
case
wie folgt in Anweisungen verwenden:Sie können auch einfach Ihre eigenen Komparatoren erstellen, indem Sie eine Struktur mit einer benutzerdefinierten Struktur verwenden
===
(Beispiel aus " Können Procs mit case-Anweisungen in Ruby 2.0 verwendet werden? ".)
Oder mit einer kompletten Klasse:
(Beispiel aus " Wie eine Ruby-Fallbeschreibung funktioniert und was Sie damit tun können ".)
quelle
Sie können reguläre Ausdrücke verwenden, z. B. das Suchen eines Zeichenfolgentyps:
Ruby
case
wird dafür den Gleichheitsoperanden verwenden===
(danke @JimDeville). Weitere Informationen finden Sie unter " Ruby Operators ". Dies kann auch am Beispiel von @mmdemirbas (ohne Parameter) erfolgen. Nur dieser Ansatz ist für diese Art von Fällen sauberer.quelle
Wenn Sie wissen möchten, wie eine ODER-Bedingung in einem Ruby-Switch-Fall verwendet wird:
In einer
case
Anweisung ist a,
also das Äquivalent zu||
einerif
Anweisung.Siehe " Wie eine Ruby-Fallerklärung funktioniert und was Sie damit tun können ".
quelle
Es heißt
case
und es funktioniert wie erwartet, plus viel mehr lustiges Zeug, mit===
dessen Hilfe die Tests implementiert werden.Nun zum Spaß:
Und es stellt sich heraus, dass Sie auch eine beliebige if / else-Kette (dh auch wenn die Tests keine gemeinsame Variable enthalten)
case
durch ersetzen können, indem Sie den Anfangsparametercase
weglassen und nur Ausdrücke schreiben, bei denen die erste Übereinstimmung Ihren Wünschen entspricht.quelle
Ruby verwendet die
case
zum Schreiben von switch-Anweisungen.Gemäß
case
Dokumentation:Beispiel:
Kürzere Version:
Und wie " Rubys Fallaussage - fortgeschrittene Techniken " Ruby beschreibt
case
;Kann mit Bereichen verwendet werden :
Kann mit Regex verwendet werden :
Kann mit Procs und Lambdas verwendet werden :
Kann auch mit Ihren eigenen Matchklassen verwendet werden:
quelle
Abhängig von Ihrem Fall können Sie es vorziehen, einen Hash von Methoden zu verwenden.
Wenn es eine lange Liste von
when
s gibt und jeder von ihnen einen konkreten Wert zum Vergleichen hat (kein Intervall), ist es effektiver, einen Hash von Methoden zu deklarieren und dann die relevante Methode aus dem Hash so aufzurufen.quelle
Da
switch case
immer ein einzelnes Objekt zurückgegeben wird, können wir das Ergebnis direkt drucken:quelle
Mehrwertiger Wann- und Nichtwertfall:
Und eine Lösung für reguläre Ausdrücke hier:
quelle
case some_string, when /\d/, (stuff), when /[a-zA-Z]/, (stuff), end
(wo,
bedeutet Newline)Sie können
case
Ausdrücke in Ruby auf zwei verschiedene Arten schreiben :if
Aussagencase
und jedewhen
Klausel wird mit dem Ziel verglichen.oder:
quelle
Sie können dies auf natürlichere Weise tun,
quelle
Viele gute Antworten, aber ich dachte, ich würde ein Faktoid hinzufügen. Wenn Sie versuchen, Objekte (Klassen) zu vergleichen, stellen Sie sicher, dass Sie eine Raumschiffmethode haben (kein Witz) oder verstehen, wie sie verglichen werden
" Ruby Equality and Object Comparison " ist eine gute Diskussion zu diesem Thema.
quelle
<=>
, die verwendet wird, um -1, 0, 1 oder Null zurückzugeben, je nachdem, ob der Vergleich weniger als, gleich, größer als oder nicht vergleichbar zurückgibt. Rubys vergleichbare Moduldokumentation erklärt es.Wie in vielen der obigen Antworten angegeben, wird der
===
Operator unter der Haube oncase
/when
Anweisungen verwendet.Hier sind zusätzliche Informationen zu diesem Operator:
Operator für die Gleichstellung von Fällen:
===
Viele der in Ruby integrierten Klassen, wie z. B. String, Range und Regexp, bieten ihre eigenen Implementierungen des
===
Operators, auch bekannt als "case-Equality", "Triple Equals" oder "Threequals". Da es in jeder Klasse unterschiedlich implementiert ist, verhält es sich je nach Objekttyp, für den es aufgerufen wurde, unterschiedlich. Im Allgemeinen wird true zurückgegeben, wenn das Objekt auf der rechten Seite zu dem Objekt auf der linken Seite gehört. Beispielsweise kann damit getestet werden, ob ein Objekt eine Instanz einer Klasse (oder einer ihrer Unterklassen) ist.Das gleiche Ergebnis kann mit anderen Methoden erzielt werden, die wahrscheinlich am besten für den Job geeignet sind, wie z. B.
is_a?
undinstance_of?
.Range Implementierung von
===
Wenn der
===
Operator für ein Bereichsobjekt aufgerufen wird, gibt er true zurück, wenn der Wert rechts in den Bereich links fällt.Denken Sie daran, dass der
===
Operator die===
Methode des linken Objekts aufruft . Ist(1..4) === 3
also gleichbedeutend mit(1..4).=== 3
. Mit anderen Worten, die Klasse des linken Operanden definiert, welche Implementierung der===
Methode aufgerufen wird, sodass die Operandenpositionen nicht austauschbar sind.Regexp Implementierung von
===
Gibt true zurück, wenn die Zeichenfolge rechts mit dem regulären Ausdruck links übereinstimmt.
Der einzige relevante Unterschied zwischen den beiden obigen Beispielen besteht darin, dass bei einer Übereinstimmung
===
true und=~
eine Ganzzahl zurückgegeben werden, was in Ruby ein wahrer Wert ist. Wir werden bald darauf zurückkommen.quelle
quelle
Weitere Informationen finden Sie unter " Ruby - if ... else, case, sofern nicht ".
quelle
Ich habe angefangen zu verwenden:
In einigen Fällen hilft es, Code zu kompaktieren.
quelle
Hash
einercase
Anweisung anstelle einer Anweisung ausgeführt werden.Keine Unterstützung für reguläre Ausdrücke in Ihrer Umgebung? ZB Shopify Script Editor (April 2018):
Eine Problemumgehung nach einer Kombination von Methoden, die hier und hier bereits behandelt wurden :
Ich habe
or
s in der Anweisung class method verwendet, da es||
eine höhere Priorität als hat.include?
. Wenn Sie ein Rubin-Nazi sind , stellen Sie sich bitte vor, ich hätte dies(item.include? 'A') || ...
stattdessen verwendet. repl.it test.quelle
Es ist wichtig, das Komma (
,
) in einerwhen
Klausel hervorzuheben . Es handelt sich||
um eineif
Anweisung, dh es wird ein ODER- Vergleich und kein UND- Vergleich zwischen den begrenzten Ausdrücken derwhen
Klausel durchgeführt. Siehe folgende Fallbeschreibung:x
ist nicht kleiner als 2, aber der Rückgabewert ist"apple"
. Warum? Weilx
war 3 und seit',`` acts as an
||, it did not bother to evaluate the expression
x <2 '.Sie könnten denken, dass Sie zum Ausführen eines UND etwas wie folgt tun können, aber es funktioniert nicht:
Es funktioniert nicht, weil
(3 && x > 2)
es als wahr ausgewertet wird, und Ruby nimmt den Wert True und vergleicht ihnx
mit===
, was nicht wahr ist, dax
es 3 ist.Um einen
&&
Vergleich durchzuführen, müssen Siecase
wie einif
/else
block behandeln:Im Ruby Programming Language-Buch sagt Matz, dass diese letztere Form die einfache (und selten verwendete) Form ist, die nichts weiter als eine alternative Syntax für
if
/elsif
/ istelse
. Unabhängig davon, ob es selten verwendet wird oder nicht, sehe ich keine andere Möglichkeit, mehrere&&
Ausdrücke für eine bestimmtewhen
Klausel anzuhängen .quelle
if...elsif
? Anscheinend versuchen Sie, eine case-Anweisung und eine Bedingung zu mischen. Warum? Setzen Sie einfach die Bedingung in den when-Block, z.when 3; ( x < 2 ) ? 'apple' : 'orange'
Wir können eine switch-Anweisung für mehrere Bedingungen schreiben.
Zum Beispiel,
quelle
case
,when
,end
) Zwischen Groß- und können so nicht groß geschrieben.NoMethodError (undefined method
CASE 'für main: Object) `. Wie @ sondra.kinsey sagte, können Sie keine Großbuchstaben verwenden. Ruby wird denken, dass es eine Konstante ist.Der
case
Anweisungsoperator ist wieswitch
in den anderen Sprachen.Dies ist die Syntax von
switch...case
in C:Dies ist die Syntax von
case...when
in Ruby:Zum Beispiel:
Weitere Informationen finden Sie in der
case
Dokumentation.quelle