Подтвердить что ты не робот

Есть ли способ ограничить/закрепить число?

Я написал следующий код, который сохраняет x в диапазоне (a..b). В псевдокоде:

(if x < a, x = a; if x > b, x = b)

В Ruby это будет что-то вроде:

x = [a, [x, b].min].max

Поскольку это довольно простая и полезная функция, мне было интересно, есть ли в Ruby встроенный метод для этого.

Как и в случае Ruby 2.3.3, по-видимому, нет такого метода, каким был бы самый короткий/более читаемый способ сделать это?

Я нашел:

x = [a, x, b].sort[1]

но я не уверен, что это более читаемо.

4b9b3361

Ответ 1

Ruby 2.4.0 вводит Comparable#clamp:

523.clamp(0, 100)        #=> 100

Ответ 2

Мой собственный ответ: НЕТ

Однако

x = [a, x, b].sort[1]

Это решение.

Ответ 3

Я сделал это:

class Numeric
  def clamp min, max
    [[self, max].min, min].max
  end
end

Поэтому всякий раз, когда я хочу зажимать что-либо, я могу просто позвонить:

x.clamp(min, max)

Что я считаю довольно читаемым.

Ответ 4

Наиболее привлекательным решением на данный момент, на мой взгляд, является вариант сортировки:

[min,x,max].sort[1] 

Если вы не возражаете, чтобы обезвреживать существующие классы ядра. Я думаю, что класс диапазона является хорошим кандидатом для метода зажима

class Range
  def clamp(v)
    [min,v,max].sort[1]
  end
end

(min..max).clamp(v)

Или объект простого массива. Мне это не нравится, потому что функция зажима верна только для трехэлементных массивов

class Array
    def clamp
      sort[1]
    end
end

Вы можете называть это следующим образом:

[a,x,b].clamp

Ответ 5

Вот мое решение, которое сильно зависит от реальной реализации:

unless Comparable.method_defined? :clamp
  module Comparable
    def clamp min, max
      if max-min<0
        raise ArgumentError, 'min argument must be smaller than max argument'
      end
      self>max ? max : self<min ? min : self
    end
  end
end