template sintax rails escape comment ruby

sintax - método de envío ruby pasando múltiples parámetros



ruby on rails haml (2)

Intentando crear objetos y llamar métodos dinámicamente por

Object.const_get(class_name).new.send(method_name,parameters_array)

que funciona bien cuando

Object.const_get(RandomClass).new.send(i_take_arguments,[10.0])

pero tirando el número equivocado de argumentos 1 para 2 para

Object.const_get(RandomClass).new.send(i_take_multiple_arguments,[25.0,26.0])

La clase aleatoria definida es

class RandomClass def i_am_method_one puts "I am method 1" end def i_take_arguments(a) puts "the argument passed is #{a}" end def i_take_multiple_arguments(b,c) puts "the arguments passed are #{b} and #{c}" end end

¿Alguien me puede ayudar a enviar dinámicamente parámetros múltiples a un método de ruby?


Alternativamente, puede llamar send con su sinónimo __send__ :

r = RandomClass.new r.__send__(:i_take_multiple_arguments, ''a_param'', ''b_param'')

Por cierto * puedes pasar hashes como params separados por coma así:

imaginary_object.__send__(:find, :city => "city100")

o nueva sintaxis hash:

imaginary_object.__send__(:find, city: "city100", loc: [-76, 39])

Según Black, __send__ es más seguro para el espacio de nombres.

"El envío es un concepto amplio: el correo electrónico se envía, los datos se envían a los enchufes de E / S, y así sucesivamente. No es raro que los programas definan un método llamado send que entra en conflicto con el método de envío incorporado de Ruby. Por lo tanto, Ruby te da una forma alternativa de llamar a enviar: __send__ . Por convención, nadie escribe un método con ese nombre, por lo que la versión incorporada de Ruby siempre está disponible y nunca entra en conflicto con los métodos recién escritos. Parece extraño, pero es más seguro que la versión de envío simple desde el punto de vista de los conflictos de nombre de método "

Black también sugiere __send__ llamadas a __send__ en if respond_to?(method_name) .

if r.respond_to?(method_name) puts r.__send__(method_name) else puts "#{r.to_s} doesn''t respond to #{method_name}" end

Ref: Black, David A. El Rubyista bien fundamentado. Manning, 2009. P.171.

* Vine aquí en busca de sintaxis hash para __send__ , por lo que puede ser útil para otros googlers. ;)


send("i_take_multiple_arguments", *[25.0,26.0]) #Where star is the "splat" operator

o

send(:i_take_multiple_arguments, 25.0, 26.0)