Déterminer si une variable est à scope?

J’ai besoin d’écrire une boucle qui fait quelque chose comme:

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

Mais jusqu’ici, les chemins de la syntaxe ont été mal orientés.

 si i. entre? (1, 10)
   faire la chose 1 
 elsif i.between? (11,20)
   faire la chose 2 
 ...

Utilisez l’opérateur === (ou son synonyme include? )

 if (1..10) === i 

Comme l’a dit @Baldu, utilisez l’opérateur === ou utilisez le cas d’utilisation / lorsque celui-ci utilise en interne ===:

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

si vous vouliez encore utiliser des gammes …

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

Vous pouvez généralement obtenir de bien meilleures performances avec quelque chose comme:

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

Pas une réponse directe à la question, mais si vous voulez le contraire de “dans”:

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

vrai

Vous pourriez utiliser
if (1..10).cover? i then thing_1 elsif (11..20).cover? i then thing_2

et selon cette référence dans Fast Ruby est plus rapide que l’ include?

Une réponse plus dynamic, qui peut être intégrée à 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 

Donc, dans ce cas, les "plages" ne sont en réalité que des bornes nils pour capter les conditions aux limites.

Pour les chaînes:

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

# => vrai