ruby方法名称中的variables

我有以下代码:

for attribute in site.device_attributes device.attribute end 

我希望代码将“属性”的值replace为方法名称。

我试过device."#{attribute}"和各种排列。

这完全不可能吗? 我错过了什么吗?

我已经考虑重写method_missing,但我无法弄清楚,当我的问题是我需要调用一个“未知”方法时,这将如何帮助我。

您可以使用#send方法通过方法名称来调用对象的方法:

 object.send(:foo) # same as object.foo 

你可以传递参数来调用方法:

 object.send(:foo, 1, "bar", 1.23) # same as object.foo(1, "bar", 1.23) 

所以,如果你在variables“属性”中有属性名称,你可以用对象的属性来读取

 object.send(attribute.to_sym) 

并用属性值写入

 object.send("#{attribute}=".to_sym, value) 

在Ruby 1.8.6中,#send方法可以执行任何对象的方法,而不pipe其可见性如何(例如,可以调用私有方法)。 这在未来版本的Ruby中可能会发生变化,您不应该依赖它。 要执行私有方法,请使用#instance_eval:

 object.instance_eval { # code as block, can reference variables in current scope } # or object.instance_eval <<-CODE # code as string, can generate any code text CODE 

更新

您可以使用public_send调用有关可见性规则的方法。

 object.public_send :public_foo # ok object.public_send :private_bar # exception 

“发送”方法应该做你想要的:

 object = "upcase me!" method = "upcase" object.send(method.to_sym) # => "UPCASE ME!" 

马特和马克西姆都是正确的,但是省略了一个细节,可以帮助你了解#send语法: 在Ruby中,调用一个方法实际上是发送一条消息。 Softies on Rails有一个相对直接的解释 。

你也可以做

 device.instance_eval(attribute)