Wie schreibe ich eine switch
Anweisung in Ruby?
Antworten
Zu viele Anzeigen?In Ruby 2.0 können Sie Lambdas auch in case
Aussagen, wie folgt:
is_even = ->(x) { x % 2 == 0 }
case number
when 0 then puts 'zero'
when is_even then puts 'even'
else puts 'odd'
end
Sie können auch ganz einfach Ihre eigenen Komparatoren erstellen, indem Sie eine Struktur mit einer benutzerdefinierten ===
Moddable = Struct.new(:n) do
def ===(numeric)
numeric % n == 0
end
end
mod4 = Moddable.new(4)
mod3 = Moddable.new(3)
case number
when mod4 then puts 'multiple of 4'
when mod3 then puts 'multiple of 3'
end
(Beispiel entnommen aus " Können procs mit case-Anweisungen in Ruby 2.0 verwendet werden? ".)
Oder mit einer ganzen Klasse:
class Vehicle
def ===(another_vehicle)
self.number_of_wheels == another_vehicle.number_of_wheels
end
end
four_wheeler = Vehicle.new 4
two_wheeler = Vehicle.new 2
case vehicle
when two_wheeler
puts 'two wheeler'
when four_wheeler
puts 'four wheeler'
end
(Beispiel entnommen aus " Wie eine Ruby Case-Anweisung funktioniert und was Sie damit tun können ".)
Sie können reguläre Ausdrücke verwenden, um z. B. eine bestimmte Art von Zeichenfolge zu finden:
case foo
when /^(true|false)$/
puts "Given string is boolean"
when /^[0-9]+$/
puts "Given string is integer"
when /^[0-9\.]+$/
puts "Given string is float"
else
puts "Given string is probably string"
end
Ruby's case
verwendet den Gleichheitsoperanden ===
dafür (danke @JimDeville). Weitere Informationen finden Sie unter " Ruby Operatoren ". Dies kann auch mit dem Beispiel von @mmdemirbas (ohne Parameter) geschehen, nur ist dieser Ansatz für diese Art von Fällen sauberer.
Es heißt case
und es funktioniert so, wie Sie es erwarten würden, plus viele weitere lustige Dinge mit freundlicher Genehmigung von ===
die die Tests implementiert.
case 5
when 5
puts 'yes'
else
puts 'else'
end
Und jetzt ein bisschen Spaß:
case 5 # every selector below would fire (if first)
when 3..7 # OK, this is nice
when 3,4,5,6 # also nice
when Fixnum # or
when Integer # or
when Numeric # or
when Comparable # (?!) or
when Object # (duhh) or
when Kernel # (?!) or
when BasicObject # (enough already)
...
end
Und es hat sich herausgestellt, dass man auch eine beliebige if/else-Kette (d.h. auch wenn die Tests keine gemeinsame Variable beinhalten) ersetzen kann durch case
durch Weglassen der anfänglichen case
Parameter und schreiben Sie nur Ausdrücke, bei denen die erste Übereinstimmung das Gewünschte ist.
case
when x.nil?
...
when (x.match /'^fn'/)
...
when (x.include? 'substring')
...
when x.gsub('o', 'z') == 'fnzrq'
...
when Time.now.tuesday?
...
end
Wenn Sie wissen möchten, wie man eine OR-Bedingung in einem Ruby-Switch-Case verwendet:
Also, in einem case
Anweisung, eine ,
ist das Äquivalent zu ||
in einem if
Erklärung.
case car
when 'Maruti', 'Hyundai'
# Code here
end
Siehe " Wie eine Ruby Case-Anweisung funktioniert und was Sie damit tun können ".
Ruby verwendet die case
zum Schreiben von switch-Anweisungen.
Gemäß der case
Dokumentation:
Case-Anweisungen bestehen aus einer optionalen Bedingung, die sich in der Position eines Arguments zu
case
und null oder mehrwhen
Klauseln. Die erstewhen
Klausel mit der Bedingung übereinstimmen (oder zu boolesche Wahrheit, wenn die Bedingung null ist) "gewinnt", und ihre Code-Strophe wird ausgeführt. Der Wert der case-Anweisung ist der Wert des Parameters erfolgreichenwhen
Klausel, odernil
wenn es keine solche Klausel gibt.Eine Case-Anweisung kann mit einem
else
Klausel. Jedewhen
a Anweisung kann mehrere Kandidatenwerte enthalten, die durch Kommata getrennt sind.
例
case x
when 1,2,3
puts "1, 2, or 3"
when 10
puts "10"
else
puts "Some other number"
end
Kürzere Version:
case x
when 1,2,3 then puts "1, 2, or 3"
when 10 then puts "10"
else puts "Some other number"
end
Und als " Rubys Falldarstellung - fortgeschrittene Techniken " beschreibt Ruby case
;
Kann verwendet werden mit Bereiche :
case 5
when (1..10)
puts "case statements match inclusion in a range"
end
## => "case statements match inclusion in a range"
Kann verwendet werden mit Regex :
case "FOOBAR"
when /BAR$/
puts "they can match regular expressions!"
end
## => "they can match regular expressions!"
Kann verwendet werden mit Procs und Lambdas :
case 40
when -> (n) { n.to_s == "40" }
puts "lambdas!"
end
## => "lambdas"
Sie können auch mit Ihren eigenen Spielklassen verwendet werden:
class Success
def self.===(item)
item.status >= 200 && item.status < 300
end
end
class Empty
def self.===(item)
item.response_size == 0
end
end
case http_response
when Empty
puts "response was empty"
when Success
puts "response was a success"
end