Ограничить число до верхних/нижних границ?

Есть ли встроенный способ или более элегантный способ ограничения числа 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

Ответ 1

Вот умный способ сделать это:

[lower_bound, num, upper_bound].sort[1]

Но это не очень читаемо. Если вам нужно сделать это один раз, я просто сделаю

num < lower_bound ? lower_bound : (num > upper_bound ? upper_bound : num)

или если вам это нужно несколько раз, обезьяна-патч модуля 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, который делает именно это.

Ответ 2

Вы можете использовать min и max, чтобы сделать код более кратким:

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

Ответ 3

class Range

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

end

Ответ 4

Поскольку вы упоминаете Rails, я расскажу, как это сделать с помощью проверки.

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

Это не будет автоматически отрегулировать номер, конечно.