2010-12-06 7 views
6

ないこのパターンが呼び出されるが、ここではシナリオですされているものを確認します。Ruby:インスタンス変数の名前を文字列で指定するインスタンス変数の値を設定することはできますか?

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

は、インスタンス変数名が文字列で作成されたインスタンス変数の値を設定するためにいくつかの方法はありますか?

のような何か:Objectの「instance_variable」の

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

"このパターンが呼び出されるかわからない" - 'Array'。 –

答えて

17

検索:

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

このパターンは、「愛情」と呼ばれます。このようなキーを計算する場合は、明示的にハッシュまたは配列を使用することをお勧めします。

+10

+1「愛情を込めて」。 "fondling"の場合は –

+0

+0です。私はpr0nの星のように実行したくありません。 –

2

あなたはそれらのインスタンス変数のアクセサメソッドを生成することができ、その後、ちょうどsendセッター:

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 
0

私は同じことを思っていたので、私はコンソールでプレーしてきました。 楽しいもの:

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:0x007fc593474900> 
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:0x007fc5934241f8> 
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:0x007fc5933e70c8> 
grandchild.something 
# => "grandchild something else" 
grandchild.something = "whatever" 
# => "whatever" 
GrandChild.something 
# => "grandchild something else" 
grandchild.something 
# => "whatever" 
関連する問題