2010-01-14 5 views
4

C'est plus une question de sémantique que toute autre chose.Comparer une variable avec deux valeurs différentes dans Ruby

Je voudrais vérifier si une variable est l'une des deux valeurs. La façon la plus simple de le faire serait:

if var == "foo" || var == "bar" 
# or 
if var == 3  || var == 5 

Mais cela ne me semble pas très sec. Je sais que je peux utiliser String.match(), mais cela ne fonctionne pas pour les variables non-chaîne et est trois fois plus lent.

Existe-t-il un meilleur moyen de vérifier une variable par rapport à deux valeurs?

Répondre

14

Mettez toutes les valeurs dans un tableau, puis cela devrait être facile.

%w[foo bar].include?('foo') # => true 

[3,5].include?(3) # => true 
+1

Manquant l'instruction if ... if (% w [foo bar] .include? (Var)) –

+0

Oui, je me suis rendu compte que je pouvais le faire presque aussitôt que j'ai posté la question. Merci! – vonconrad

1

Vous pouvez faire:

%W(foo bar baz).include? var 

Ou:

[3, 5].include? var 
5

La déclaration case semble faire ce que vous voulez.

case var 
    when "foo", "bar" then case1() 
end 

case var 
    when 3, 5 then case2() 
end 

Les méthodes basées sur des tableaux semblent susceptibles d'être plus lentes.

+0

La notation de cas enveloppe juste en utilisant '# ===' pour chaque instruction when, donc ce sera la même chose que 'if [" foo "," bar "] === var puis case1(); elsif [3,5] === var puis case2(); end' – rampion

+0

J'ai essayé de tester la vitesse de cette méthode par rapport à la méthode '.include?' équivalente, et 'case' était légèrement plus rapide. Pas assez pour faire un argument convaincant, cependant. –

+0

Mon problème avec cette approche est plus clunk que le 'if [1,2] .include? (1)'. Je suis d'accord que 'case' fonctionne très bien en remplacement de plusieurs instructions if et elsif, mais pas pour quelque chose de simple comme ça. – vonconrad

Questions connexes