ruby clamp

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