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)