ruby enumerable

¿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]