Ruby:是否可以设置实例变量的值,其中实例变量通过字符串命名?

不确定这个模式是什么,但这里是场景:

class Some #this class has instance variables called @thing_1, @thing_2 etc. end 

有没有办法设置实例变量的值,其中实例变量名由字符串创建?

就像是:

 i=2 some.('thing_'+i) = 55 #sets the value of some.thing_2 to 55 

在Object上搜索“instance_variable”:

 some.instance_variable_get(("@thing_%d" % 2).to_sym) some.instance_variable_set(:@thing_2, 55) 

这种模式被称为“爱抚”; 如果您要计算这样的密钥,那么明确使用Hash或Array可能是一个更好的主意。

您可以为这些实例变量生成访问器方法,然后只send setter:

 class Stuff attr_accessor :thing_1, :thing_2 end i = 1 s = Stuff.new s.send("thing_#{i}=", :bar) s.thing_1 # should return :bar 

我想知道同样的事情,所以我一直在玩控制台。 好玩的东西 :

 class Parent class << self attr_accessor :something def something(value = nil) @something = value ? value : @something end def inherited(subclass) self.instance_variables.each do |var| subclass.instance_variable_set(var, self.instance_variable_get(var)) end end end attr_accessor :something self.something = 'Parent Default' def something(value = nil) @something = value ? value : @something ? @something : self.class.something end end class Child < Parent # inherited form Parent.something end class GrandChild < Child something "GrandChild default" end 

结果是 :

 Parent.something # => "Parent Default" Parent.something = "Parent something else" # => "Parent something else" Parent.something # => "Parent something else" parent = Parent.new # => # parent.something # => "Parent something else" parent.something = "yet something different" # => "yet something different" parent.something # => "yet something different" parent.class.something # => "Parent something else" Child.something # => "Parent Default" child = Child.new # => # child.something # => "Parent Default" GrandChild.something # => "GrandChild default" GrandChild.something("grandchild something else") # => "grandchild something else" GrandChild.something # => "grandchild something else" GrandChild.superclass.something # => "Parent Default" grandchild = GrandChild.new # => # grandchild.something # => "grandchild something else" grandchild.something = "whatever" # => "whatever" GrandChild.something # => "grandchild something else" grandchild.something # => "whatever"