ruby发送方法传递多个参数

尝试创build对象和dynamic调用方法

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

这是工作正常的时候

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

但是为了2而抛出错误数量的参数1

 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 

有人可以帮助我如何发送多个参数dynamicruby方法

2 Solutions collect form web for “ruby发送方法传递多个参数”

 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') 

顺便说一下*你可以传递哈希作为参数逗号分隔如此:

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

或新的哈希语法:

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

根据Black, __send__对名称空间比较安全。

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

黑色还build议在调用__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 

参考:黑色,大卫A.充分基础的Rubyist。 曼宁,2009年,第171页。

*我来这里寻找__send__哈希语法,所以可能对其他googlers有用。 ;)

  • 覆盖devise注册控制器
  • 奇怪的\ n在base64编码的string在Ruby中
  • inheritanceRuby中的modules / mixins的类方法
  • Ruby,RVM,LLVM和MySQL
  • 如何将一个String对象转换成一个Hash对象?
  • 最佳实践:尝试与拯救
  • 如何按字母顺序sortingstring?
  • 如果string为空,则返回一些默认值
  • 在Ruby中,“if __FILE__ == $ 0”是什么意思
  • 在Ruby中删除数组中的重复元素
  • 在Ruby中检测操作系统