我需要编写一个循环,执行以下操作:
if i (1..10) do thing 1 elsif i (11..20) do thing 2 elsif i (21..30) do thing 3 etc...
但到目前为止,在语法方面已经走上了错误的道路。
使用 ===操作符(或其同义词 include?)
===
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
如果(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?的方法!
#include?
#between?