¿Determinar si una variable está dentro del rango?

Necesito escribir un bucle que haga algo como:

if i (1..10) do thing 1 elsif i (11..20) do thing 2 elsif i (21..30) do thing 3 etc... 

Pero hasta ahora han ido por el camino equivocado en términos de syntax.

 si i.between? (1, 10)
   hacer la cosa 1 
 Elsif i.between? (11,20)
   hacer la cosa 2 
 ...

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

 if (1..10) === i 

Como dijo @Baldu, use el operador === o el caso de uso / cuando usa internamente ===:

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

Si todavía quisieras usar rangos …

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

Por lo general, puede obtener un rendimiento mucho mejor con algo como:

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

No es una respuesta directa a la pregunta, pero si quieres lo contrario a “dentro”:

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

cierto

Usted podría usar
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?

Una respuesta más dinámica, que se puede construir 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 

Entonces, en este caso, los "rangos" están realmente cercados con nils para capturar las condiciones de contorno.

Para cuerdas:

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

# => verdadero