传递多个参数的 ruby send 方法

尝试通过以下方法动态创建对象和调用方法

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

这是工作正常的时候

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

但是对于。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

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

有人可以帮助我如何发送多个参数到一个 Ruby 方法动态

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

或者

send(:i_take_multiple_arguments, 25.0, 26.0)

你可以用它的同义词 __send__交替调用 send:

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

顺便说一下 * 你可以把散列表传递给像这样分开的 params 逗号:

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 版本总是可用的,而且从来不会与新编写的方法发生冲突。它看起来很奇怪,但是从方法名冲突的角度来看,它比普通的发送版本更安全

Black 还建议在 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

参考文献: 布莱克,大卫 A。脚踏实地的红宝石爱好者。曼宁,2009。 P. 171。

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