在 Ruby 中,我有一个属性名称列表,如下所示:
names = [
:foo,
#...
]
我想遍历列表,并使用反射对属性名称执行条件赋值。因此,例如,而不是这个,它不使用反射:
self.foo ||= 0
我想要这样的东西:
for name in names
#use local variable "name" to perform assignment using reflection
end
如何使用 Ruby 反射来实现这一点?
在 Ruby 中,我有一个属性名称列表,如下所示:
names = [
:foo,
#...
]
我想遍历列表,并使用反射对属性名称执行条件赋值。因此,例如,而不是这个,它不使用反射:
self.foo ||= 0
我想要这样的东西:
for name in names
#use local variable "name" to perform assignment using reflection
end
如何使用 Ruby 反射来实现这一点?
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
这可能更容易理解。
names.each { |name| self.instance_variable_set("@#{name}", 0) }
可能是您需要做的第一个近似值。