【发布时间】:2010-10-26 14:39:54
【问题描述】:
我需要编写一个循环来执行以下操作:
if i (1..10)
do thing 1
elsif i (11..20)
do thing 2
elsif i (21..30)
do thing 3
etc...
但到目前为止,在语法方面走错了路。
【问题讨论】:
标签: ruby integer conditional range
我需要编写一个循环来执行以下操作:
if i (1..10)
do thing 1
elsif i (11..20)
do thing 2
elsif i (21..30)
do thing 3
etc...
但到目前为止,在语法方面走错了路。
【问题讨论】:
标签: ruby integer conditional range
如果您需要最快的方法,请使用旧的比较。
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? 方法快几乎快3倍!
【讨论】:
您可以使用if (1..10).cover? i then thing_1
elsif (11..20).cover? i then thing_2
根据Fast Ruby 中的这个基准,它比include? 快
【讨论】:
不是问题的直接答案,但如果您想要与“内部”相反:
(2..5).exclude?(7)
是的
【讨论】:
exclude? 是Rails addition。
您通常可以通过以下方式获得更好的性能:
if i >= 21
# do thing 3
elsif i >= 11
# do thing 2
elsif i >= 1
# do thing 1
【讨论】:
对于字符串:
(["GRACE", "WEEKLY", "DAILY5"]).include?("GRACE")
#=>真
【讨论】:
【讨论】:
Date 和 DateTime 对象,而 === 不适用。
i.between?(1..10) 不行(如果是..)我想一定是有原因的
3.between?(1, 3) => true
更动态的答案,可以用 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
因此,在这种情况下,“范围”实际上只是用 nil 围起来以捕捉边界条件。
【讨论】:
使用=== 运算符(或其同义词include?)
if (1..10) === i
【讨论】:
i 一起工作的好处不是数字(如nil)
if i === (1..10) 的替代方式将不起作用
(1..10000000000000000) 不是数组。 (1..10000000000000000) === 5000000000000000 只是在后台进行“介于”测试
正如@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
【讨论】: