确定变量是否在范围内?

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

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

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

87308 次浏览

使用 ===操作符(或其同义词 include?)

if (1..10) === i

如果你还想用射程..。

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

正如@Baldu 所说,使用 = = = 操作符或者在内部使用 = = = 时使用用例/:

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

一个更动态的答案,可以在 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

因此,在这种情况下,为了捕获边界条件,“范围”实际上只是用 nils 封装起来。

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

弦乐器:

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

# = > true

你通常可以得到更好的表现,比如:

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

这不是对这个问题的直接回答,但如果你想要“内在”的对立面:

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

没错

你可以用
如果(1. . 10) . 覆盖? i 然后事物 _ 1 埃尔西夫(11. . 20)。盖? 我然后事情 _ 2

根据这个基准,快速红宝石include?

如果你需要最快的方法来做到这一点,使用好的老比较。

require 'benchmark'


i = 5
puts Benchmark.measure { 10000000.times {(1..10).include?(i)} }
puts Benchmark.measure { 10000000.times {i.between?(1, 10)}   }
puts Benchmark.measure { 10000000.times {1 <= i && i <= 10}   }

在我的系统指纹上:

0.959171   0.000728   0.959899 (  0.960447)
0.919812   0.001003   0.920815 (  0.921089)
0.340307   0.000000   0.340307 (  0.340358)

正如你所看到的,双重比较是 几乎快了三倍#include?#between?的方法!