Ограничить число до верхних/нижних границ?
Есть ли встроенный способ или более элегантный способ ограничения числа 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
Это не будет автоматически отрегулировать номер, конечно.