在Ruby中,我有一个属性名称列表,如下所示:
names = [
:foo,
#...
]
我想遍历列表并使用反射对属性名称执行条件赋值。所以,例如,而不是这个,不使用反射:
self.foo ||= 0
我想要像这样的东西:
for name in names
#use local variable "name" to perform assignment using reflection
end
如何使用Ruby反射实现这一目标?
答案 0 :(得分:2)
names.each { |name| self.instance_variable_set("@#{name}", 0) }
可能是您需要做的第一个近似值。
答案 1 :(得分:2)
foo.bar ||= baz
大致等同于
foo.bar || foo.bar = baz
我认为它不完全相同,但足够接近你的目的。所以,
names.each do |name| send(name) || send(:"#{name}=", 0) end
应该做你想做的事。这当然等同于
names.each do |name| send(:"#{name}=", 0) if send(name) end
可能更容易理解。