创建具有此类行为的方法的最佳方法是什么?
def foo(arg1, arg2, some_method_name)
arg1.some_method_name(arg2)
end
我知道应该有一些Ruby魔法,简单而纯粹。
答案 0 :(得分:4)
def foo(arg1, arg2, some_method_name)
arg1.public_send(some_method_name, arg2)
end
答案 1 :(得分:0)
在Ruby中,方法调用只是发送给对象的消息。
您正在寻找
def foo(arg1, arg2, some_method_name)
arg1.send(some_method_name.to_s, arg2)
end
请注意,此方法可以访问类的公共方法和私有方法;这可能是测试所需要的,但如果您希望私有方法失败,只需使用public_send
def foo(arg1, arg2, some_method_name)
arg1.public_send(some_method_name.to_s, arg2)
end
如果您可能在该对象上定义了现有的发送方法,只需将send
替换为__send__
有关详细信息,请参阅https://ruby-doc.org/core-2.5.1/Object.html#method-i-send
答案 2 :(得分:0)
还建议使用这样的方法,你可以为方法提供变量参数
def foo(arg1, method_name, *args)
arg1.public_send(method_name, *args) # dynamically dispatch the method with the relevant arguments
end
foo("kiddorails", :upcase) # KIDDORAILS
foo("kiddorails", :gsub, 's', '') # kiddorail