2009-03-07 17 views
19

Rubyでアクセサーメソッドを動的に呼び出すにはどうすればよいですか? ...私は、変数を読み取ることObject.sendメソッドを使用することができますRubyでアクセサーメソッドを動的に呼び出す方法

class Test_Class 
    attr_accessor :a, :b 
end 

instance.a = "value" 
puts(instance.send("a")) 
# => value 

しかし、私はに作成しようと苦労している:ここで

は、例えば、クラスのそれ。これらのスロー "の引数の数が間違って(0 1)(例外ArgumentError)"

instance.send("a", "value") 

instance.method("a").call("value") 

は私を助けてくださいStackOverflowの!

答えて

44

私はルビーの専門家ではないが、私はあなたができると思う:

instance.send("a=", "value") 
+0

素晴らしい作品を、!私は等号がメソッド名の一部だと思いますか? –

+0

はい、Rubyでsetterメソッドを定義するための従来の方法と同じ記号です。 私は文字列ではなくシンボルを使用します。 'instance.send(:a =、" value ")' –

+0

うん。 attr_accessorは2つのメソッドを作成します: def v; @v; end および def v =(値); @ v =値; end – Angela

9

ます。また、直接instance_variable_*機能使用して、オブジェクトのインスタンス変数にアクセスすることができます。

instance = Test_Class.new     # => #<Test_Class:0x12b3b84> 

# instance variables are lazily created after first use of setter, 
# so for now instance variables list is empty: 
instance.instance_variables    # => [] 

instance.instance_variable_set(:@a, 123) # => 123 
instance.a         # => 123 
instance.instance_variables    # => ["@a"] 
instance.instance_variable_get("@a")  # => 123 
関連する問題