Ruby量化一个范围

Ruby quantify a range

我有一个 Ruby 数组,它定义了一组整数阈值

thresholds = [under_threshold_1, under_threshold_2, ..., under_threshold_n, over_threshold]

我想将任何整数映射到对应于阈值数字的值。基本上

if threshold_a <  number < threshold_b
  return threshold_a
end

在 Ruby 中有没有很酷的方法来做到这一点?我需要处理 "edge" 个案例 < threshold_1> threshold_over。我只能想出一组(丑陋但有效的)if 语句或在数组上循环。

我实际上可以自由地按照我想要的方式对其进行建模(如果更方便,我可以将数组更改为其他内容)

我在想也许有一种很酷的方法可以在 case/when 子句中标出阈值

case number
when 0..threshold_1 then 0
when threshold_i..threshold_i+1 then i
else n
end

# example
thresholds  = [ 4, 8, 10 ,12 ]

quantify(1) = 0
quantify(4) = 1 
quantify(11) = 3
quantify(50) = 4

我想这就是你想要的:

Thresholds = [4, 8, 10, 12]

def quantify(n)
  Thresholds.count { |t| n >= t }
end

你要的这个n的量化恰好是n大于等于的阈值个数,用Enumerable#count.

很容易计算出来

这个怎么样?

thresholds = [ 4, 8, 10, 12 ]

def which_threshold(thresholds, n)
  thresholds.find_index {|t| n < t } || thresholds.size
end

p which_threshold(thresholds, 1)  # => 0
p which_threshold(thresholds, 4)  # => 1
p which_threshold(thresholds, 11) # => 3
p which_threshold(thresholds, 50) # => 4