在Ruby或Rails中,是否有內置方式或更優雅的方式來限制數字num上/下限?將數字限制在上限/下限?
例如是這樣的:
def number_bounded (num, lower_bound, upper_bound)
return lower_bound if num < lower_bound
return upper_bound if num > upper_bound
num
end
在Ruby或Rails中,是否有內置方式或更優雅的方式來限制數字num上/下限?將數字限制在上限/下限?
例如是這樣的:
def number_bounded (num, lower_bound, upper_bound)
return lower_bound if num < lower_bound
return upper_bound if num > upper_bound
num
end
這裏有一個聰明的方式做到這一點:
[lower_bound, num, upper_bound].sort[1]
但是,這不是很可讀。如果你只需要做一次,我只想做
num < lower_bound ? lower_bound : (num > upper_bound ? upper_bound : num)
,或者如果你需要它多次,猴子修補可比模塊:
module Comparable
def bound(range)
return range.first if self < range.first
return range.last if self > range.last
self
end
end
所以你可以使用它像
num.bound(lower_bound..upper_bound)
你也可以只需要ruby facets,它增加了一個方法clip
這樣做。
您可以使用最小值和最大值,使代碼更簡潔:
number_bounded = [lower_bound, [upper_bound, num].min].max
這可能是比sort()版本更快的方法。謝謝。 – Amy 2010-06-16 22:57:38
既然你提到了Rails,我會提到如何通過驗證來做到這一點。
validates_inclusion_of :the_column, :in => 5..10
這當然不會自動調整數量。
class Range
def clip(n)
if cover?(n)
n
elsif n < min
min
else
max
end
end
end
謝謝,我可能會去Ruby Facets路線。 – Amy 2010-06-16 22:56:51