How can I dynamically define attr_accessors on an object?
EX:;:
class Person
attr_accessor :firstname
end
p = Person.new
p.firstname = ‘aaron’
p.instance_variable_set(:@lastname, ‘smith’)
puts p.inspect
puts p.firstname
puts p.lastname
the last line generates an “undefined method lastname” error…
any ideas?
thanks
On Tue, 26 Jun 2007 01:23:44 +0900, Aaron S.
[email protected] wrote:
How can I dynamically define attr_accessors on an object?
EX:;:
class Person
attr_accessor :firstname
end
p = Person.new
p.firstname = ‘aaron’
class << p
attr_accessor :lastname
end
p.lastname = ‘smith’
puts p.inspect
puts p.firstname
puts p.lastname
You have to explicitly create the accessor methods; you don’t get them
automatically when setting an instance variable.
-mental
On 25.06.2007 18:23, Aaron S. wrote:
puts p.firstname
puts p.lastname
the last line generates an “undefined method lastname” error…
any ideas?
Use OpenStruct.
robert
On 6/25/07, Aaron S. [email protected] wrote:
puts p.firstname
puts p.lastname
the last line generates an “undefined method lastname” error…
any ideas?
thanks
–
I suppose you could do something like:
class Person
def def_accessor name, val=nil
self.class.class_eval { attr_accessor name.intern }
instance_variable_set ( “@#{name}”.intern, val )
end
end
Then you could do something like:
h = { “fooname”=>“Foo”, “age”=>28 }
h.each {|key,value| p.def_accessor key, value }
…but the other suggestion to use OpenStruct is probably a better idea.
Phil
thanks for the suggestions… went with the openstruct.