¿Cómo encontrar un min / max con Ruby?


Quiero hacer algo simple y directo, como min(5,10), o Math.max(4,7). Hay funciones para este efecto en Ruby?

Author: Andrew Grimm, 2009-09-01

5 answers

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.

La versión 2.4 introduce Array#min y Array#max propios, que son mucho más rápidos que los métodos de Enumerable porque omiten llamar 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]
 621
Author: theIV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-03 06:24:08

Puedes usar

[5,10].min 

O

[4,7].max

Es un método para matrices.

 48
Author: Diego Dias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-23 14:08:49

Todos esos resultados generan basura en un intento celoso de manejar más de dos argumentos. Me gustaría 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 su pregunta. :)

 19
Author: Dave Morse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-10 19:11:24

Además de las respuestas proporcionadas, si desea convertir Enumerable#max en un método max que pueda llamar a un número variable o argumentos, como en algunos otros lenguajes de programación, puede 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 proporcionaron argumentos. En este último caso, el método devolverá nil, ya que llamando Enumerable#max en un objeto array vacío devuelve nil.

Si desea definir este método en el módulo de Matemáticas, 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(?:). Ver Respuesta de Dave Morse para un método más simple y más rápido.

 19
Author: HamsterMuffin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:48

Si necesitas encontrar el max/min 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]
 14
Author: aaron-coding,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-24 19:54:58