ruby 限制一个数字的上/下界?

w46czmvw  于 2023-08-04  发布在  Ruby
关注(0)|答案(5)|浏览(95)

在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

字符串

unguejic

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来完成这一任务。

ruyhziif

ruyhziif2#

你可以使用min和max来使代码更简洁:

number_bounded = [lower_bound, [upper_bound, num].min].max

字符串

os8fio9y

os8fio9y3#

class Range

  def clip(n)
    if cover?(n)
      n
    elsif n < min
      min
    else
      max
    end
  end

end

字符串

z4bn682m

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'

字符串

jgzswidk

jgzswidk5#

既然你提到了Rails,我将提到如何通过验证来实现这一点。

validates_inclusion_of :the_column, :in => 5..10

字符串
当然,这不会自动调整数字。

相关问题