私は次のように何かを書いています
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
ますか?ある時点で、オブジェクトを渡して、オブジェクトに独自のメソッドを呼び出させる可能性があると思います。
私が呼び出したいメソッドは、文字通りどこでもかまいません。
アップデート:
それぞれの提案を試してみると、何が起こっているのかは明らかなので、明示的な受信者はそれを行うのに良い方法のように見えますが、クリスチャンブレアの考えはどうでしょうか。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)
が、おそらくいくつかの落とし穴があります...