将数字限制为上限/下限?

Amy*_*Amy 11 ruby ruby-on-rails

是否有一个内置的方式,限制了一些更优雅的方式NUM在Ruby或者Rails中到上/下限?

例如:

def number_bounded (num, lower_bound, upper_bound)
  return lower_bound if num < lower_bound
  return upper_bound if num > upper_bound
  num
end
Run Code Online (Sandbox Code Playgroud)

mck*_*eed 13

这是一个聪明的方法:

[lower_bound, num, upper_bound].sort[1]
Run Code Online (Sandbox Code Playgroud)

但那不是很可读.如果你只需要做一次,我就会这么做

num < lower_bound ? lower_bound : (num > upper_bound ? upper_bound : num)
Run Code Online (Sandbox Code Playgroud)

或者如果您需要多次,可以对可比模块进行修补:

module Comparable
  def bound(range)
     return range.first if self < range.first
     return range.last if self > range.last
     self
  end
end
Run Code Online (Sandbox Code Playgroud)

所以你可以像使用它一样

num.bound(lower_bound..upper_bound)
Run Code Online (Sandbox Code Playgroud)

你也可以只需要ruby facets,它会添加一个方法clip来实现这一点.


Mar*_*ers 12

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

number_bounded = [lower_bound, [upper_bound, num].min].max
Run Code Online (Sandbox Code Playgroud)