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