¿Cómo encuentras un mínimo/máximo con Ruby?
enumerable (5)
Quiero hacer algo simple y directo, como min(5,10)
o Math.max(4,7)
. ¿Hay funciones a este efecto en Ruby?
Además de las respuestas proporcionadas, si desea convertir Enumerable#max en un método máximo que pueda llamar a un número variable o argumentos, como en otros lenguajes de programación, podría escribir:
def max(*values)
values.max
end
Salida:
max(7, 1234, 9, -78, 156)
=> 1234
Esto abusa de las propiedades del operador splat para crear un objeto de matriz que contiene todos los argumentos proporcionados, o un objeto de matriz vacío si no se proporcionaron argumentos. En este último caso, el método devolverá nil
, ya que al llamar a Enumerable#max en un objeto de matriz vacío se devuelve nil
.
Si desea definir este método en el módulo matemático, esto debería hacer el truco:
module Math
def self.max(*values)
values.max
end
end
Tenga en cuenta que Enumerable.max es, al menos, dos veces más lento en comparación con el operador ternario ( ?:
. Vea la respuesta de Dave Morse para un método más simple y rápido.
Puedes usar
[5,10].min
o
[4,7].max
Es un método para Arrays.
Si necesitas encontrar el máximo / mínimo de un hash, puedes usar #max_by
o #min_by
people = {''joe'' => 21, ''bill'' => 35, ''sally'' => 24}
people.min_by { |name, age| age } #=> ["joe", 21]
people.max_by { |name, age| age } #=> ["bill", 35]
Todos esos resultados generan basura en un intento ferviente de manejar más de dos argumentos. Tendría curiosidad por ver cómo se desempeñan en comparación con el buen ''ol:
def max (a,b)
a>b ? a : b
end
que es, por cierto, mi respuesta oficial a tu pregunta. :)
Tu puedes hacer
[5, 10].min
o
[4, 7].max
Vienen del módulo Enumerable , por lo que cualquier cosa que incluya Enumerable
tendrá esos métodos disponibles.
v2.4 introduce su propia Array#min
y Array#max
, que son mucho más rápidas que los métodos de Enumerable porque #each
llamadas a #each
.
EDITAR
@nicholasklick menciona otra opción, Enumerable#minmax
, pero esta vez devolviendo una matriz de [min, max]
.
[4, 7].minmax
=> [4, 7]
No parece muy interesante con solo 2 valores en la matriz inicial, por lo que
[4, 5, 7, 10].minmax
=> [4, 10]