ruby - ¿Hay un método para limitar/sujetar un número?
clamp (5)
Aquí está mi solución que toma mucho de la implementación real:
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
Escribí el siguiente código, que mantiene a x
dentro del rango (a..b)
. En pseudo código:
(if x < a, x = a; if x > b, x = b)
En Ruby sería algo como:
x = [a, [x, b].min].max
Como es una función bastante básica y útil, me preguntaba si hay un método nativo para hacerlo en ruby.
A partir de Ruby 2.3.3 aparentemente no existe un método como este, ¿cuál sería la forma más corta / más legible de hacerlo?
Encontré:
x = [a, x, b].sort[1]
Hasta ahora, pero no estoy seguro de si es más legible.
Hice esto:
class Numeric
def clamp min, max
[[self, max].min, min].max
end
end
Entonces, cuando quiera sujetar algo, solo puedo llamar:
x.clamp(min, max)
Que me parece bastante legible.
La solución más atractiva por ahora en mi opinión es la opción de clasificación:
[min,x,max].sort[1]
Cuando no te importa parchar a los monos las clases básicas existentes. Creo que la clase de rango es un buen candidato para un método de pinza
class Range
def clamp(v)
[min,v,max].sort[1]
end
end
(min..max).clamp(v)
O el objeto de matriz plana. No me gusta esto, porque la función de sujeción solo es correcta para matrices de 3 elementos
class Array
def clamp
sort[1]
end
end
Puedes llamarlo así:
[a,x,b].clamp
Mi propia respuesta: NO
sin embargo
x = [a, x, b].sort[1]
Es una solucion
Ruby 2.4.0 introduce la Comparable#clamp
:
523.clamp(0, 100) #=> 100