2012-04-21 14 views
5

Jaki jest rozsądny sposób na powiedzenie tego.Eleganckie przykuty do testowania na tej samej zmiennej w Ruby

if @thing == "01" or "02" or "03" or "04" or "05" 

(Liczby są zawarte w kolumnie typ danych string.)

+0

Poprawna, ale wersja gadatliwy byłyby 'jeśli @thing == "01" || @thing == "02" || ... ' –

+2

Zwróć uwagę, że [' i '/' lub 'is * not * to samo, co' && '/' || 'w Ruby] (http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby /). –

Odpowiedz

11

Złóż tablicę i używać .include?

if ["01","02","03","04","05"].include?(@thing) 

Jeśli wartości naprawdę są kolejne, można użyć szeregu jak (1..5).include? W przypadku ciągów można użyć:

if ("01".."05").include?(@thing) 
+1

Lub w tym szczególnym przypadku, '(" 01 ".." 05 "). Include? (@ Rzecz)' –

+0

Jeśli tylko tablice Ruby przeszły wyszukiwanie binarne, może to zająć czas 'O (log n)' zamiast 'O (n) 'czas. –

+5

@ MДΓΓБДLL: Ruby ma zestawy, więc 'Set.new (" 01 ".." 05 "). Include? To" O (1) ". –

3

Lub użyć st przypadku atement:

case @thing 
when "01", "02", "03", "04", "05" 
    # do your things 
end 

Dwa warianty tego podejścia:

case @thing 
when "01".."05" 
    # do your things 
end 

case @thing 
when *%w[01 02 03 04 05] 
    # do your things 
end 

Ponieważ case wykorzystuje ===, można również napisać: ("01".."05") === @thing

+1

Miło, nie wiedziałem, że można użyć operatora splat w gałęziach 'when'. –

+0

Operator '===' wprowadza w błąd, IMHO, ponieważ oznacza coś zupełnie innego w innych językach, w których jest dostępny. "include?" jest znacznie bardziej czytelne. –

+0

Zgadzam się z tobą, nigdy go nie używałem w ten sposób;) –

Powiązane problemy