在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
字符串
unguejic1#
这里有一个聪明的方法:
[lower_bound, num, upper_bound].sort[1]
字符串但这不是很可读。如果你只需要做一次,我会做
num < lower_bound ? lower_bound : (num > upper_bound ? upper_bound : num)
型或者如果你需要它多次,monkey-patch Comparable模块:
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来完成这一任务。
clip
ruyhziif2#
你可以使用min和max来使代码更简洁:
number_bounded = [lower_bound, [upper_bound, num].min].max
os8fio9y3#
class Range def clip(n) if cover?(n) n elsif n < min min else max end end end
z4bn682m4#
你要找的方法是clamp:https://ruby-doc.org/core/Comparable.html#method-i-clamp
12.clamp(0, 100) #=> 12 523.clamp(0, 100) #=> 100 -3.123.clamp(0, 100) #=> 0 'd'.clamp('a', 'f') #=> 'd' 'z'.clamp('a', 'f') #=> 'f'
jgzswidk5#
既然你提到了Rails,我将提到如何通过验证来实现这一点。
validates_inclusion_of :the_column, :in => 5..10
字符串当然,这不会自动调整数字。
5条答案
按热度按时间unguejic1#
这里有一个聪明的方法:
字符串
但这不是很可读。如果你只需要做一次,我会做
型
或者如果你需要它多次,monkey-patch Comparable模块:
型
这样你就可以像
型
您也可以只需要ruby facets,它添加了一个方法
clip
来完成这一任务。ruyhziif2#
你可以使用min和max来使代码更简洁:
字符串
os8fio9y3#
字符串
z4bn682m4#
你要找的方法是clamp:https://ruby-doc.org/core/Comparable.html#method-i-clamp
字符串
jgzswidk5#
既然你提到了Rails,我将提到如何通过验证来实现这一点。
字符串
当然,这不会自动调整数字。