尝试通过
动态创建对象和调用方法Object.const_get(class_name).new.send(method_name,parameters_array)
时工作正常
Object.const_get(RandomClass).new.send(i_take_arguments,[10.0])
但为
输入错误数量的参数1为2Object.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
有人可以帮助我如何动态地将多个参数发送到ruby方法
答案 0 :(得分:206)
send("i_take_multiple_arguments", *[25.0,26.0]) #Where star is the "splat" operator
或
send(:i_take_multiple_arguments, 25.0, 26.0)
答案 1 :(得分:6)
您也可以使用同义词send
来呼叫__send__
:
r = RandomClass.new
r.__send__(:i_take_multiple_arguments, 'a_param', 'b_param')
顺便说一下*你可以像下面这样用逗号分隔哈希:
imaginary_object.__send__(:find, :city => "city100")
或新的哈希语法:
imaginary_object.__send__(:find, city: "city100", loc: [-76, 39])
根据Black的说法,__send__
对命名空间更安全。
“发送是一个广泛的概念:发送电子邮件,将数据发送到I / O套接字,等等。程序定义一个名为send的方法与Ruby的内置send方法冲突的情况并不少见。因此,Ruby为您提供了另一种调用send:
__send__
的方法。按照惯例,没有人用该名称编写方法,因此内置的Ruby版本始终可用,并且永远不会与新编写的方法发生冲突。它看起来很奇怪,但从方法名称冲突的角度来看它比普通发送版本更安全“
布莱克还建议将调用打包到__send__
中的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.有条不紊的Rubyist。 Manning,2009。P.171。
*我来到这里寻找__send__
的哈希语法,因此对其他google可能会有用。 ;)