2311 Stimmen

Wie man eine switch-Anweisung in Ruby schreibt

Wie schreibe ich eine switch Anweisung in Ruby?

83voto

James Lim Punkte 12683

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 ".)

53voto

Haris Krajina Punkte 14008

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.

38voto

DigitalRoss Punkte 138823

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

33voto

Manish Shrivastava Punkte 27921

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 ".

26voto

Lahiru Jayaratne Punkte 1576

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 mehr when Klauseln. Die erste when 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 erfolgreichen when Klausel, oder nil wenn es keine solche Klausel gibt.

Eine Case-Anweisung kann mit einem else Klausel. Jede when 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

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