¿Mejor forma de obtener de un array el ob jeto con un atributo mayor?

Hola, tengo un array con objetos de la misma clase, y dichos objetos
tienen un @atributo con “attr_reader”.
Ahora quiero obtener el objeto que tenga el más alto valor numérico
para dicho @atributo, pero no sé cómo hacerlo a la “Ruby way” (de
hecho sólo lo logro haciendo el típico “for” de C y tal):


max_i=0;
max_atributo=0;

for i in 0…(array.length - 1) do
if array[i].atributo >= max_atributo
max_atributo = array[i].atributo
max_i=i
end
end

puts “Máximo: array[#{max_i}].atributo = #{max_atributo}”

Ahora lo que yo quiero es ponerlo “bonito”, en plan con dos líneas, un
“find” mágico o lo que sea, que se note la magia de Ruby… pero no se
me ocurre ninguna forma. ¿Alguna sugerencia para mejorar ese código?

Gracias.

Puedes usar max:
http://www.ruby-doc.org/core/classes/Enumerable.html#M003165

para hacerlo más o menos así:

array.max {|elem1,elem2| elem1.atributo <=> elem2.atributo}

Saludos,
Raul M.

El 4/10/07, javier ramirez [email protected] escribió:

en tu clase, por ejemplo
esto mismo es aplicable a sort y similares
¡Qué buena! Gracias a los dos, he visto la luz :wink:

Saludos.

Hola,

Puedes usar max:
module Enumerable - RDoc Documentation

para hacerlo más o menos así:

array.max {|elem1,elem2| elem1.atributo <=> elem2.atributo}

y si vas a usarlo mucho para esa clase, puedes definirte el método <=>
en tu clase, por ejemplo

class MiTipo
def <=> (other_obj)
self.campo_para_comparar <=> other_obj.campo_para_comparar
end
end

y ahora ya puedes usar sobre tu array directamente
my_array_de_objetos_tipo.max

esto mismo es aplicable a sort y similares

saludos,

javier ramirez

Tambien podrias generalizarlo para que sirva con cualquier atributo
del objecto…, z.b:

def max_by (sym)
max {|x, y| x.send(sym) <=> y.send(sym)}
end

como añadir un metodo a la clase array produce escalofrios cuando
menos puedes añadirselo a una instancia [1] en particular.

[1] :

Pedro Del G.

Email : [email protected]