2012-12-10 33 views
89

试图创建对象和由红宝石发送方法传递多个参数

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

动态调用方法,其工作正常时

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

但投掷错误的参数数目1 2

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

定义的随机类是

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 

有人可以帮助我如何发送多发参数红宝石方法动态

回答

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

send(:i_take_multiple_arguments, 25.0, 26.0) 
+17

可能值得注意的是,在这种情况下'*'是“splat”操作符。 –

4

或者,您可以拨打send与它的同义词__send__

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

顺便说一下*你可以pa SS哈希作为PARAMS逗号隔开,像这样:

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

或新的哈希语法:

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

据黑,__send__是安全的命名空间。

“发送是一个广泛的概念:发送电子邮件,数据发送到I/O套接字等等。程序定义一个名为send的方法与Ruby的内置发送方法冲突并不罕见。因此,Ruby为您提供了另一种调用send的方法:__send__。按照惯例,没有人用这个名字写一个方法,所以内置的Ruby版本总是可用的,并且永远不会与新编写的方法发生冲突。这看起来很奇怪,但它比平原从安全的观点方法名冲突点​​”

黑色也表明在if respond_to?(method_name)包装调用__send__发送版本。

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.这位基础良好的Rubyist。曼宁,2009年.P.171。

*我来这里寻找散列语法__send__,所以可能对其他谷歌有用。 ;)