2311 Stimmen

Wie man eine switch-Anweisung in Ruby schreibt

Wie schreibe ich eine switch Anweisung in Ruby?

4voto

Navneet Punkte 340
$age =  5
case $age
when 0 .. 2
   puts "baby"
when 3 .. 6
   puts "little child"
when 7 .. 12
   puts "child"
when 13 .. 18
   puts "youth"
else
   puts "adult"
end

Siehe " Ruby - if...else, case, unless " für weitere Informationen.

3voto

CPHPython Punkte 9094

Keine Unterstützung für reguläre Ausdrücke in Ihrer Umgebung? z.B. Shopify Skript-Editor (April, 2018):

[Fehler]: Uninitialisierte Konstante RegExp

Eine Umgehung durch eine Kombination von Methoden, die bereits zuvor in これ y これ :

code = '!ADD-SUPER-BONUS!'

class StrContains
  def self.===(item)
    item.include? 'SUPER' or item.include? 'MEGA' or\
    item.include? 'MINI' or item.include? 'UBER'
  end
end

case code.upcase
when '12345PROMO', 'CODE-007', StrContains
  puts "Code #{code} is a discount code!"
when '!ADD-BONUS!'
  puts 'This is a bonus code!'
else
  puts 'Sorry, we can\'t do anything with the code you added...'
end

Ich habe or s in der Methodenanweisung der Klasse, da || hat einen höheren Vorrang als .include? .

Wenn Sie immer noch lieber die || , auch wenn or ist in diesem Fall vorzuziehen können Sie dies stattdessen tun: (item.include? 'A') || ... . Sie können es hier testen repl.it .

3voto

Daniel Viglione Punkte 6606

Es ist wichtig, das Komma zu betonen ( , ) in einer when Klausel. Sie dient als || eines if Anweisung, d.h. sie führt eine OR Vergleich und nicht eine UND Vergleich zwischen den abgegrenzten Ausdrücken der when Klausel. Siehe die folgende Fallanweisung:

x = 3
case x
  when 3, x < 2 then 'apple'
  when 3, x > 2 then 'orange'
end
 => "apple"

x nicht kleiner als 2 ist, aber der Rückgabewert ist "apple" . Warum? Weil x war 3 und seit ',`` acts as an || , it did not bother to evaluate the expression x < 2'.

Man könnte meinen, dass die Durchführung einer UND Sie können so etwas wie das Folgende tun, aber es funktioniert nicht:

case x
  when (3 && x < 2) then 'apple'
  when (3 && x > 2) then 'orange'
end
 => nil 

Es funktioniert nicht, weil (3 && x > 2) wird zu true ausgewertet, und Ruby vergleicht den Wert True mit x con === was nicht wahr ist, da x ist 3.

Um eine && Vergleich, müssen Sie die case wie ein if / else Block:

case
  when x == 3 && x < 2 then 'apple'
  when x == 3 && x > 2 then 'orange'
end

Im Buch Ruby Programming Language sagt Matz, dass diese letztere Form die einfache (und selten verwendete) Form ist, die nichts anderes als eine alternative Syntax für if / elsif / else . Unabhängig davon, ob sie nur selten benutzt wird oder nicht, sehe ich keine andere Möglichkeit, mehrere && Ausdrücke für eine bestimmte when Klausel.

0 Stimmen

Das scheint mir kein guter Kodierungsstil zu sein. Die Verwendung einer seltenen alternativen Syntax macht die Sache unnötig unübersichtlich. Warum nicht die normale if...elsif ? Es scheint, dass Sie versuchen, eine Case-Anweisung und eine Bedingung zu vermischen. Und warum? Setzen Sie einfach die Bedingung innerhalb den Wenn-Block, z. B.. when 3; ( x < 2 ) ? 'apple' : 'orange'

2voto

Ben96 Punkte 511

Die case Anweisungsoperator ist wie switch in den anderen Sprachen.

Dies ist die Syntax von switch...case in C:

switch (expression)
{
    case constant1:
      // statements
      break;
    case constant2:
      // statements
      break;
    .
    .
    .
    default:
      // default statements
}

Dies ist die Syntax von case...when in Ruby:

case expression
  when constant1, constant2 #Each when statement can have multiple candidate values, separated by commas.
     # statements 
     next # is like continue in other languages
  when constant3
     # statements 
     exit # exit is like break in other languages
  .
  .
  .
  else
     # statements
end

Zum Beispiel:

x = 10
case x
when 1,2,3
  puts "1, 2, or 3"
  exit
when 10
  puts "10" # it will stop here and execute that line
  exit # then it'll exit
else
  puts "Some other number"
end

Weitere Informationen finden Sie in der case Dokumentation.

1voto

Foram Punkte 456

Wir können switch-Anweisungen für mehrere Bedingungen schreiben.

Zum Beispiel,

x = 22

CASE x
  WHEN 0..14 THEN puts "#{x} is less than 15"    
  WHEN 15 THEN puts "#{x} equals 15" 
  WHEN 15 THEN puts "#{x} equals 15" 
  WHEN 15..20 THEN puts "#{x} is greater than 15" 
  ELSE puts "Not in the range, value #{x} " 
END

2 Stimmen

Dies wird nicht funktionieren; Ruby-Schlüsselwörter (z.B.. case , when , end ) unterscheiden Groß- und Kleinschreibung und können nicht wie hier in Großbuchstaben geschrieben werden.

0 Stimmen

NoMethodError (undefined method CASE' für main:Object)`. Wie @sondra.kinsey sagte, kann man keine Großbuchstaben verwenden. Ruby wird denken, es sei eine KONSTANTE.

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