我有以下代码:
for attribute in site.device_attributes
device.attribute
end
我希望代码用"attribute"的值替换方法名.
我try 了device."#{attribute}"
种不同的排列方式.
这完全不可能吗?我错过什么了吗?
我已经考虑过重写方法_missing,但当我的问题是需要调用一个"未知"的方法时,我不知道这实际上会如何帮助我.
我有以下代码:
for attribute in site.device_attributes
device.attribute
end
我希望代码用"attribute"的值替换方法名.
我try 了device."#{attribute}"
种不同的排列方式.
这完全不可能吗?我错过什么了吗?
我已经考虑过重写方法_missing,但当我的问题是需要调用一个"未知"的方法时,我不知道这实际上会如何帮助我.
您可以使用#send method按方法名调用对象的方法:
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)
并用
object.send("#{attribute}=".to_sym, value)
在Ruby 1.8.6中,send方法可以执行任何对象的方法,而不管其可见性如何(例如,可以调用私有方法).这可能会在Ruby的future 版本中发生变化,您不应该依赖它.要执行私有方法,请使用#实例_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