在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