Ответ 1
Ruby 2.4.0 вводит Comparable#clamp
:
523.clamp(0, 100) #=> 100
Я написал следующий код, который сохраняет 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]
но я не уверен, что это более читаемо.
Ruby 2.4.0 вводит Comparable#clamp
:
523.clamp(0, 100) #=> 100
Мой собственный ответ: НЕТ
Однако
x = [a, x, b].sort[1]
Это решение.
Я сделал это:
class Numeric
def clamp min, max
[[self, max].min, min].max
end
end
Поэтому всякий раз, когда я хочу зажимать что-либо, я могу просто позвонить:
x.clamp(min, max)
Что я считаю довольно читаемым.
Наиболее привлекательным решением на данный момент, на мой взгляд, является вариант сортировки:
[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
Вот мое решение, которое сильно зависит от реальной реализации:
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