Fernando C. escribió:
Raul M. - Freelance Web D.
Y ahora, la duda: si esto funciona, y el send de cartuchoGL también
funciona, ¿alguien sabrÃa decir qué es mejor?
s2 y gracias!!
Bueno, la diferencia es grande, los dos hacen cosas distintas, con eval
lo que haces es llamar al interpretre de ruby para ejecutar ese codigo,
puedes hacer lo que quieras en eval.
eval(‘2+2’)
devolveria 4 y
eval(‘2+2;2+1’)
devolveria 3, por el rollo ese de devolver lo ultimo ejecutado. Incluso
algo como:
eval(<<-COSA)
class Pepito
def hola
puts ‘hola’
end
end
COSA
Puedes ver eval como una especie de interprete de ruby dentro de ruby.
En cambio send es un metodo de la clase Object que lo que hace es,
hablando en terminos orientados a objetos, mandar un mensaje al objeto,
por ejemplo siguiendo el eval anterior podriamos:
a=Pepito.new
a.hola
a.send(‘hola’)
El efecto de las dos ultimas expresiones es exactamente el mismo, llamar
al metodo hola.
Y para no enrollarme mas y responder a tu pregunta de cual es mejor, la
respuesta es ‘rendimiento’, y para muetra un boton:(basado en el codigo
del Programing Ruby 2ªEd pag409)
require ‘benchmark’
include Benchmark
test = ‘soy una cadena’
n = 100000
bm(12) {|x|
x.report(‘send’) { n.times { test.send(:length) } }
x.report(‘eval’) { n.times { eval ‘test.length’ } }
}
que en mi maquina devuelve:
user system total real
send 0.040000 0.000000 0.040000 ( 0.041161)
eval 0.380000 0.000000 0.380000 ( 0.382172)
Conclusion eval es unas 9 veces mas lento que usar send.
Un saludo.