is there a way to add attributes to instances?

A

ako...

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?

thanks for the help
konstantin
 
J

James Edward Gray II

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
=> <OpenStruct>
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
=> #<Magic:0x1b0764>
irb(main):030:0> b.new_property = 123
=> 123
irb(main):031:0> b.new_property
=> 123

Hope that helps.

James Edward Gray II
 
J

James Britt

ako... said:
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?

class <<a
attr_accessor :newproperty
end


James

--

http://www.ruby-doc.org - The Ruby Documentation Site
http://www.rubyxml.com - News, Articles, and Listings for Ruby & XML
http://www.rubystuff.com - The Ruby Store for Ruby Stuff
http://www.jamesbritt.com - Playing with Better Toys
 
R

Rob Rypka

Here's two different ideas to get you going:

irb(main):001:0> require "ostruct"
=3D> true
irb(main):002:0> a =3D OpenStruct.new
=3D> <OpenStruct>
irb(main):003:0> a.new_property =3D 123
=3D> 123
irb(main):004:0> a.property
=3D> nil

I think OpenStruct is what you want to use. If you feel you have to
implement it yourself, or it's not quite right, think about using
method_missing. It is perhaps the most awsomely useful concepts in
Ruby.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,818
Latest member
Brigette36

Latest Threads

Top