我正在写如下内容
module Test
def self.print(*args)
p 'something'
p args
end
end
def print(*args)
p "print something"
p args
end
def method_caller(method_name, *args)
send(method_name, *args)
end
method_caller(:print, 2) # this works fine
method_caller("print", 2, 3) # this one also
method_caller("Test.print", 2) # this doesn't work
基本上,我传递method_caller
了一个方法的名称和一些参数,然后我使用该send
方法来实际调用该方法。
我通常将方法的名称作为符号传递,但我将如何处理Test.print
?我想在某些时候我可能会传入对象并让它们调用自己的方法。
我想调用的方法实际上可以在任何地方。
更新:
尝试每个建议,显式接收器看起来是一个很好的方法,因为很明显正在发生什么,但是 christianblais 的想法呢。我改变了它以避免eval
这样的电话
def method_caller(method_name, *args)
if method_name.is_a?(String)
chain = method_name.split('.')
obj, method_name = Object.const_get(chain[0...-1].join('.')), chain[-1]
obj.send(method_name, *args)
else
send(method_name, args)
end
end
这意味着我只能说method_caller("Test.print", 2)
,但也许有一些陷阱......