Ruby,将方法名称作为参数,然后将其发送给对象

时间:2018-06-06 13:33:48

标签: ruby

创建具有此类行为的方法的最佳方法是什么?

def foo(arg1, arg2, some_method_name)
  arg1.some_method_name(arg2)
end

我知道应该有一些Ruby魔法,简单而纯粹。

3 个答案:

答案 0 :(得分:4)

尝试Object#public_send

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