Class Instantiation

I have a few questions about class instantiation.

Say I have a class:

class Person
attr_accessor :name, :age
end

And an array:

names = ["john", "jane"]

Is it possible to instantiate a class using a string from the array so
I get something equal to:

john = Person.new
jane = Person.new

v/r,

names.each do |n|
  eval n + ' = Person.new'
end

I'm sure there is a neater solution to this, but I'll put this forward for now.

Douglas F Shearer
dougal.s@gmail.com

···

On 14 Aug 2007, at 22:24, jantzeno wrote:

Is it possible to instantiate a class using a string from the array so

jantzeno wrote:

I have a few questions about class instantiation.

Say I have a class:

class Person
attr_accessor :name, :age
end

And an array:

names = ["john", "jane"]

Is it possible to instantiate a class using a string from the array so
I get something equal to:

john = Person.new
jane = Person.new

v/r,

You can, but it might be better to do something like this if you have
lots of names in your names array:

people = Array.new ;

names.each_with_index {|n,i|
   people[i] = Person.new ;
   people[i].name = n ;
}

Todd

···

--
Posted via http://www.ruby-forum.com/\.

hi its seems like you have done a hard work on it. I have got lots of

information from your post. Really appreciate your work.!! It was

describe very nicely keep us doing good work..

···

--
Posted via http://www.ruby-forum.com/.

Hi --

Is it possible to instantiate a class using a string from the array so

names.each do |n|
  eval n + ' = Person.new'
end

That won't work, both because it's inside a block:

   1.times do
     david = 1
   end

   p david # error -- undefined

and because eval creates its own binding for local variable
assignments:

   eval("a = 1")
   p a

For both reasons, the variable would already have to be in view before
the eval.

The best and most common advice given in response to this question is:
do it with a hash instead, like this:

   people = {}
   names.each {|name| people[name] = Person.new }

David

···

On Wed, 15 Aug 2007, Douglas F Shearer wrote:

On 14 Aug 2007, at 22:24, jantzeno wrote:

--
* Books:
   RAILS ROUTING (new! http://www.awprofessional.com/title/0321509242\)
   RUBY FOR RAILS (http://www.manning.com/black\)
* Ruby/Rails training
     & consulting: Ruby Power and Light, LLC (http://www.rubypal.com)

The best and most common advice given in response to this question is:
do it with a hash instead, like this:

   people = {}
   names.each {|name| people[name] = Person.new }

This was going to be my next question.

Then I can do a:

people["john"].name = "john"

Brilliant, thanks.