2311 Stimmen

Wie man eine switch-Anweisung in Ruby schreibt

Wie schreibe ich eine switch Anweisung in Ruby?

9voto

jmansurf Punkte 103

Viele großartige Antworten, aber ich dachte, ich würde eine Tatsache 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 Gleichheit und Objektvergleich " ist eine gute Diskussion zu diesem Thema.

10 Stimmen

Zum Vergleich: Die "Raumschiff"-Methode ist <=> die verwendet wird, um -1, 0, 1 oder nil zurückzugeben, je nachdem, ob der Vergleich weniger als, gleich, größer als oder nicht vergleichbar ergibt. Ruby's Vergleichbar Die Dokumentation des Moduls erklärt es.

8voto

BrunoF Punkte 2833

Wie in vielen der oben genannten Antworten erwähnt, ist die === Operator wird unter der Haube verwendet auf case / when Erklärungen.

Hier finden Sie zusätzliche Informationen über diesen Betreiber:

Fallgleichheitsoperator: ===

Viele der in Ruby eingebauten Klassen, wie String, Range und Regexp, bieten ihre eigenen Implementierungen der === Operator, auch bekannt als "case-equality", "triple equals" oder "threequals". Da er in jeder Klasse anders implementiert ist, verhält er sich je nach Art des Objekts, für das er 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" oder "ein Mitglied von" ist. Sie kann beispielsweise verwendet werden, um zu prüfen, ob ein Objekt eine Instanz einer Klasse (oder einer ihrer Unterklassen) ist.

String === "zen"  # Output: => true
Range === (1..2)   # Output: => true
Array === [1,2,3]   # Output: => true
Integer === 2   # Output: => true

Das gleiche Ergebnis lässt sich auch mit anderen Methoden erzielen, die für diese Aufgabe wahrscheinlich am besten geeignet sind, z. B. is_a? y instance_of? .

Bereich Implementierung von ===

Wenn die === Operator für ein Bereichsobjekt aufgerufen wird, gibt er true zurück, wenn der Wert auf der rechten Seite innerhalb des Bereichs auf der linken Seite liegt.

(1..4) === 3  # Output: => true
(1..4) === 2.345 # Output: => true
(1..4) === 6  # Output: => false

("a".."d") === "c" # Output: => true
("a".."d") === "e" # Output: => false

Denken Sie daran, dass die === Operator ruft den === Methode des linken Objekts. Also (1..4) === 3 ist gleichbedeutend mit (1..4).=== 3 . Mit anderen Worten: Die Klasse des linken Operanden bestimmt, welche Implementierung der === Methode aufgerufen wird, so dass die Operandenpositionen nicht austauschbar sind.

Regexp Implementierung von ===

Gibt true zurück, wenn die Zeichenfolge auf der rechten Seite mit dem regulären Ausdruck auf der linken Seite übereinstimmt.

/zen/ === "practice zazen today"  # Output: => true
# is similar to
"practice zazen today"=~ /zen/

Der einzige relevante Unterschied zwischen den beiden obigen Beispielen ist, dass bei einer Übereinstimmung, === gibt true zurück und =~ gibt eine ganze Zahl zurück, was in Ruby ein Wahrheitswert ist. Wir werden bald darauf zurückkommen.

6voto

Paulo Belo Punkte 2229

Wenn Sie "kleiner als" oder "größer als" benötigen:

case x
when 1..5
  "It's between 1 and 5"
when 6
  "It's 6"
when 7..1.0/0
  "It's equal or greater than 7"
when -1.0/0..0
  "It's equal or less than 0"
end

1.0/0 ist gleich Float::INFINITY Sie können also die von Ihnen bevorzugte Methode verwenden.

Nach Ruby 2.6 können Sie Endlose Weiten , Nach Ruby 2.7 können Sie auch verwenden Anfangslose Bereiche so können Sie zum Beispiel tun:

case x
when 1..5
  "It's between 1 and 5"
when 6
  "It's 6"
when (7..)
  "It's equal or greater than 7"
when (..0)
  "It's equal or less than 0"
end

5voto

Prabhakar Undurthi Punkte 6202
puts "Recommend me a language to learn?"
input = gets.chomp.downcase.to_s

case input
when 'ruby'
    puts "Learn Ruby"
when 'python'
    puts "Learn Python"
when 'java'
    puts "Learn Java"
when 'php'
    puts "Learn PHP"
else
    "Go to Sleep!"
end

4voto

deepfritz Punkte 426

Ich habe angefangen, sie zu benutzen:

a = "secondcase"

var_name = case a
  when "firstcase" then "foo"
  when "secondcase" then "bar"
end

puts var_name
>> "bar"

In manchen Fällen hilft es, den Code zu verdichten.

1 Stimmen

Code wie dieser sollte normalerweise mit einer Hash und nicht eine case Erklärung.

0 Stimmen

Die Verwendung eines Hashes wäre schneller, wenn der Schalter groß wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X