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)