From: James Edward Gray II Date: 2005-10-07T11:47:41+09:00 Subject: Re: is there a way to add attributes to instances? On Oct 6, 2005, at 9:36 PM, ako... wrote: > hello, > > is there a way to add properties to instances and access them later > just like if they were defined in the object's class? > > > a.newproperty = 123 > puts a.newproperty > > i know how to dynamically add newproperty to the class of instance > 'a', > but is there a way to do it per instance? or do i have to maintain an > explicit hash table on my objects and access these attributes through > the table? Here's two different ideas to get you going: irb(main):001:0> require "ostruct" => true irb(main):002:0> a = OpenStruct.new => irb(main):003:0> a.new_property = 123 => 123 irb(main):004:0> a.property => nil irb(main):018:0> class Magic irb(main):019:1> def method_missing( meth, *args, &block ) irb(main):020:2> if meth.to_s =~ /^(\w+)=$/ irb(main):021:3> instance_variable_set("@#{$1}", *args) irb(main):022:3> elsif instance_variables.include? "@#{meth}" irb(main):023:3> instance_variable_get("@#{meth}") irb(main):024:3> else irb(main):025:3* super irb(main):026:3> end irb(main):027:2> end irb(main):028:1> end => nil irb(main):029:0> b = Magic.new => # irb(main):030:0> b.new_property = 123 => 123 irb(main):031:0> b.new_property => 123 Hope that helps. James Edward Gray II