2180 votes

Comment puis-je écrire une instruction switch dans Ruby ?

Comment puis-je écrire une instruction switch dans Ruby ?

2803voto

Chuck Points 138930

Ruby utilise l’expression case.

La comparaison est faite en comparant l’objet dans la clause when avec l’objet à l’aide de la clause case le opérateur. Autrement dit, il fait et , pas . Cela permet la sémantique sophistiquée que vous voyez ci-dessus, où vous pouvez utiliser les gammes et les classes et toutes sortes de choses, et non juste tester pour l’égalité.

460voto

kikito Points 23229

case...when se comporte de façon un peu inattendue lors de la manipulation de cours. Cela est dû au fait qu'il utilise l' === de l'opérateur.

Cet opérateur fonctionne comme prévu avec des littéraux, mais pas avec des classes:

1 === 1
 => true
Fixnum === Fixnum
 => false

Cela signifie que si vous voulez faire un case ... when - dessus d'un objet de la classe, cela ne fonctionnera pas:

obj = 'hello'
case obj.class
when String
  print('It is a string')
when Fixnum
  print('It is a number')
else
  print('It is not a string')
end

Imprimé "Ce n'est pas une chaîne".

Heureusement, cela est facilement résolu. L' === de l'opérateur a été définie de sorte qu'elle renvoie true si vous l'appliquez sur une classe et une instance de cette classe. En bref, le code ci-dessus peut être fixé par le retrait de l' .class:

obj = 'hello'
case obj  # was case obj.class
when String
  print('It is a string')
when Fixnum
  print('It is a number')
else
  print('It is not a string')
end

J'ai frappé ce problème aujourd'hui, alors que la recherche d'une réponse, et c'était la première apparition de la page, j'ai donc pensé qu'il serait utile pour d'autres personnes dans ma situation.

229voto

動靜能量 Points 33008

il est effectué par cas en Ruby. Voir aussi cet article dans Wikipedia.

cité:

case n
when 0 
  puts 'You typed zero'
when 1, 9 
  puts 'n is a perfect square'
when 2 
  puts 'n is a prime number'
  puts 'n is an even number'
when 3, 5, 7 
  puts 'n is a prime number'
when 4, 6, 8 
  puts 'n is an even number'
else              
  puts 'Only single-digit numbers are allowed'
end

un autre exemple:

score = 70

result = case score
   when 0..40 then "Fail"
   when 41..60 then "Pass"
   when 61..70 then "Pass with Merit"
   when 71..100 then "Pass with Distinction"
   else "Invalid Score"
end

puts result

Autour de la page 123 (je suis en utilisant Kindle) de La Programmation Ruby Lanugage (1ère Édition, O'Reilly) , dit-il, l' then mot-clé suivant l' when clauses peut être remplacé par un saut de ligne ou un point-virgule. (tout comme dans l' if then else de la syntaxe) (Ruby 1.8 permet également une virgule à la place de then... Mais cette syntaxe n'est plus autorisé dans Ruby 1.9)

110voto

mmdemirbas Points 3205
<h1>cas... quand<p>Pour ajouter d’autres exemples à <a href="http://stackoverflow.com/a/948157/471214">la réponse de Chuck</a>:</p><p><strong>Avec le paramètre :</strong></p><pre><code></code></pre><p><strong>Sans paramètre :</strong></p><pre><code></code></pre><p>S’il vous plaît, soyez conscient du <a href="http://stackoverflow.com/a/5694333/471214">problème</a> que kikito avertit.</p></h1>

80voto

Jim Lim Points 4981

En Ruby 2.0, vous pouvez également utiliser les lambdas en case des déclarations, comme suit:

is_even = ->(x) { x % 2 == 0 }

case number
when 0 then puts 'zero'
when is_even then puts 'even'
else puts 'odd'
end

Vous pouvez également créer votre propre comparateurs facilement à l'aide d'une Structure avec une coutume ===

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

(Exemple tiré de "Peut procs être utilisé avec des cas énoncés dans Ruby 2.0?".)

Ou, avec une classe complète:

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

(Exemple tiré de "Comment Un Rubis Cas de Déclaration de Travaux Et de Ce que Vous Pouvez Faire Avec lui".)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X