¿Cómo se encuentra un mínimo/máximo con Ruby?

Quiero hacer algo simple y sencillo, como min(5,10), o Math.max(4,7). ¿Existen funciones para ello en Ruby?

Solución

Puedes hacer

[5, 10].min

o

[4, 7].max

Provienen del módulo Enumerable, por lo que cualquier cosa que incluya Enumerable tendrá esos métodos disponibles.

La v2.4 introduce los métodos propios Array#min y Array#max, que son mucho más rápidos que los de Enumerable porque omiten la llamada a #each.

EDITAR

@nicholasklick menciona otra opción, Enumerable#minmax, pero esta vez devolviendo un array de [min, max].

[4, 5, 7, 10].minmax
=> [4, 10]
Comentarios (13)

Puede utilizar

[5,10].min 

o

[4,7].max

Es un método para Arrays.

Comentarios (2)

Además de las respuestas proporcionadas, si quieres convertir Enumerable#max en un método max que pueda llamar a un número variable o a argumentos, como en algunos otros lenguajes de programación, podrías 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 array que contenga todos los argumentos proporcionados, o un objeto array vacío si no se proporcionan argumentos. En este último caso, el método devolverá nil, ya que al llamar a Enumerable#max sobre un objeto array vacío se devuelve nil.

Si quieres definir este método en el módulo Math, esto debería ser suficiente:

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 (?:). Véase la respuesta de Dave Morse's para un método más sencillo y rápido.

Comentarios (1)