红宝石发送方法传递多个参数


129

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

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

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

Answers:


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

要么

send(:i_take_multiple_arguments, 25.0, 26.0)

22
可能值得注意的是,*在这种情况下,“ splat”运算符是。
安德鲁·马歇尔

8

您可以交替调用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])

据布莱克说,__send__对名称空间更安全。

“发送是一个广泛的概念:发送电子邮件,将数据发送到I / O套接字,等等。” 程序定义与Ruby的内置send方法冲突的方法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

参考:布莱克,大卫·A(David A.)。曼宁,2009年。第171页。

*我来这里的目的是寻找的哈希语法__send__,因此可能对其他Google员工有用。;)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.