我有以下代码:
for attribute in site.device_attributes
device.attribute
end
我希望代码用"属性"的值替换方法名称。
我已尝试device."#{attribute}"
和各种排列组合。
这完全不可能吗?我有什么遗漏吗?
我考虑过重写 method_missing,但是我无法想象这实际上如何帮助我,因为我的问题是我需要调用一个“未知”的方法。
我有以下代码:
for attribute in site.device_attributes
device.attribute
end
我希望代码用"属性"的值替换方法名称。
我已尝试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)
因此,如果您在变量“attribute”中具有属性名称,则可以使用该变量读取对象的属性。
object.send(attribute.to_sym)
请翻译以下内容,并附加属性值: And write attribute's value with. 并附加属性值。
object.send("#{attribute}=".to_sym, value)
在Ruby 1.8.6中,#send方法可以执行任何对象的方法,而不考虑其可见性(例如,您可以调用私有方法)。这在将来的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
“send”方法应该做你想要的事情:
object = "upcase me!"
method = "upcase"
object.send(method.to_sym) # => "UPCASE ME!"
Matt和Maxim都是正确的,但是忽略了一个可能帮助你理解 #send 语法的细节:Ruby中,调用方法实际上是发送消息。 Softies on Rails提供了一个相对简单的解释。
你也可以做。
device.instance_eval(attribute)