Ограничить число верхними / нижними границами? - PullRequest
11 голосов
/ 16 июня 2010

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

Ответы [ 4 ]

13 голосов
/ 16 июня 2010

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

[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, который делает именно это.

12 голосов
/ 16 июня 2010

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

number_bounded = [lower_bound, [upper_bound, num].min].max
1 голос
/ 04 июля 2013
class Range

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

end
0 голосов
/ 16 июня 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...