使用Ruby反射执行条件赋值

时间:2013-03-25 12:25:53

标签: ruby reflection

在Ruby中,我有一个属性名称列表,如下所示:

names = [
  :foo,
  #...
]

我想遍历列表并使用反射对属性名称执行条件赋值。所以,例如,而不是这个,不使用反射:

self.foo ||= 0

我想要像这样的东西:

for name in names
   #use local variable "name" to perform assignment using reflection 
end

如何使用Ruby反射实现这一目标?

2 个答案:

答案 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

可能更容易理解。