2009-05-15 18 views

Respuesta

77

Utilice el operador === (o su sinónimo include?)

if (1..10) === i 
+1

Tiene la ventaja agradable de trabajar también con 'ser I' algo más que un número (como 'nil') –

+3

No parecería una solución muy eficiente si el rango hubiera sido significativamente grande. – rthbound

+4

Para lectores futuros, la forma alternativa 'if i === (1..10)' no funcionará – Anwar

34

si todavía quería utilizar rangos ...

def foo(x) 
if (1..10).include?(x) 
    puts "1 to 10" 
elsif (11..20).include?(x) 
    puts "11 to 20" 
end 
end 
+5

Creo que esta debería haber sido la respuesta marcada. – Geo

65

Como se ha dicho @Baldu, usar el operador === o use case/when which usa internamente ===:

case i 
when 1..10 
    # do thing 1 
when 11..20 
    # do thing 2 
when 21..30 
    # do thing 3 
etc... 
+0

de todas las respuestas, esto también es probablemente el más eficaz cuando tiene múltiples rangos. – xentek

0

Una respuesta más dinámica, que c un ser construido en Ruby:

def select_f_from(collection, point) 
    collection.each do |cutoff, f| 
    if point <= cutoff 
     return f 
    end 
    end 
    return nil 
end 

def foo(x) 
    collection = [ [ 0, nil ], 
       [ 10, lambda { puts "doing thing 1"} ], 
       [ 20, lambda { puts "doing thing 2"} ], 
       [ 30, lambda { puts "doing thing 3"} ], 
       [ 40, nil ] ] 

    f = select_f_from(collection, x) 
    f.call if f 
end 

Por lo tanto, en este caso, los "rangos" son en realidad sólo cercados con Nils con el fin de atrapar a las condiciones de contorno.

273
 
if i.between?(1, 10) 
    do thing 1 
elsif i.between?(11,20) 
    do thing 2 
... 
+3

Esto también funciona para los objetos 'Date' y' DateTime' mientras '===' no. – Aditya

+0

'i.between? (1..10)' no funcionará (si es '..') Supongo que debe haber una razón para ello –

+0

** entre? ** necesitaría dos parámetros que no permitiría distancia. –

-2

For Strings:

(["GRACE", "WEEKLY", "DAILY5"]).include?("GRACE") 

# => true

6

Generalmente, usted puede obtener una gran cantidad mejor rendimiento con algo como:

if i >= 21 
    # do thing 3 
elsif i >= 11 
    # do thing 2 
elsif i >= 1 
    # do thing 1 
3

No es una respuesta directa a la pregunta, pero si quiere lo opuesto a "dentro":

(2..5).exclude?(7) 

cierto

2

Usted podría utilizar
if (1..10).cover? i then thing_1 elsif (11..20).cover? i then thing_2

y de acuerdo con este punto de referencia en Fast Ruby es más rápido que include?

+0

Esto es en realidad mucho más rápido –

Cuestiones relacionadas