60 votes

Teste si une variable est égale à l'une des deux valeurs

Je veux tester si a est égal à 1 ou 2

je pourrais faire

 a == 1 || a == 2
 

mais cela nécessite de répéter a (ce qui serait agaçant pour des variables plus longues)

J'aimerais faire quelque chose comme a == (1 || 2) , mais évidemment cela ne fonctionnera pas

Je pourrais faire [1, 2].include?(a) , ce qui n'est pas mauvais, mais me semble un peu plus difficile à lire

Je me demandais comment faire avec un rubis idiomatique

39voto

Peter Points 38320

Votre première méthode est idiomatique Ruby. Malheureusement, Ruby n’a pas d’équivalent du a in [1,2] de Python, ce qui serait mieux, à mon avis. Votre [1,2].include? a est l'alternative la plus proche, et je pense que c'est un peu en arrière de la manière la plus naturelle.

Bien sûr, si vous en utilisez beaucoup, vous pouvez le faire:

 class Object
  def member_of? container
    container.include? self
  end
end
 

et alors vous pouvez faire a.member_of? [1, 2] .

12voto

Jack Chu Points 3795

Je ne sais pas dans quel contexte vous utilisez ceci, mais si cela correspond à une instruction switch, vous pouvez le faire:

 a = 1
case a
when 1, 2
  puts a
end
 

Un autre avantage est que lorsque vous utilisez l'opérateur d'égalité de cas ===, vous pouvez donc, si vous le souhaitez, remplacer cette méthode pour un comportement différent. Une autre solution est que vous pouvez également utiliser des plages avec celle-ci si cela correspond à votre cas d'utilisation:

 when 1..5, 7, 10
 

10voto

Arcolye Points 2602

Une autre solution consisterait à demander à "Matz" d'ajouter cette fonctionnalité à la spécification Ruby.

 if input == ("quit","exit","close","cancel") then
  #quit the program
end
 

En fait, l'instruction case-when vous permet de faire exactement cela:

 case input when "quit","exit","close","cancel" then 
  #quit the program
end
 

Sur une ligne comme celle-ci, il agit et ressemble presque à une instruction if. L'exemple inférieur est-il une bonne substitution temporaire pour l'exemple supérieur? Vous êtes le juge.

7voto

Jeremy Ruten Points 59989

D'abord, mettez ceci quelque part:

 class Either < Array
  def ==(other)
    self.include? other
  end
end

def either(*these)
  Either[*these]
end
 

Ensuite, alors:

 if (either 1, 2) == a
  puts "(i'm just having fun)"
end
 

2voto

ghostdog74 Points 86060
a.to_s()=~/^(1|2)$/

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