确定一个variables是否在范围内?

我需要编写一个循环,执行如下操作:

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

但是到目前为止,在语法方面已经走上了错误的道路。

如果i.between(1,10)
  做事1 
 elsif i.between?(11,20)
  做事2 
 ...

使用===运算符(或其同义词include?

 if (1..10) === i 

正如@Baldu所说,使用===运算符或用例/当内部使用===:

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

如果你仍然想使用范围…

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

通常你可以通过如下方式获得更好的性能:

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

不是直接回答这个问题,但是如果你想相反的“内”:

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

真正

一个更dynamic的答案,可以在Ruby中构build:

 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 

因此,在这种情况下,“范围”实际上只是用nils围起来以便捕捉边界条件。

你可以使用
if (1..10).cover? i then thing_1 elsif (11..20).cover? i then thing_2

而且根据Fast Ruby的这个基准是否比include?速度更快include?

对于string:

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

#=>真