0

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

names = [
  :foo,
  #...
]

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

self.foo ||= 0

我想要这样的东西:

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

如何使用 Ruby 反射来实现这一点?

4

2 回答 2

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

这可能更容易理解。

于 2013-03-25T14:02:39.693 回答
2
names.each { |name| self.instance_variable_set("@#{name}", 0) }

可能是您需要做的第一个近似值。

于 2013-03-25T12:35:26.173 回答