On Feb 26, 2011, at 8:29 PM, Marc Chanliau wrote:

> In Ruby it seems you can instantiate a class inside the class itself =
or
> outside. What is the accepted convention?
> In the following example, instantiation is inside the class:
>=20
> class Person
>  attr_accessor :name, :age, :gender
>=20
>  def initialize(name, age, gender)
>    @name =3D name
>    @age =3D age.to_i
>    @gender =3D gender
>  end
>=20
>  # method to print a new person
>  def printIt
>    print "    "
>    print name
>    print ", "
>    print age
>    print ", "
>    print gender
>    puts
>  end
>=20
>  # generating instances and printing them from inside the class itself
> person_instance =3D Person.new("Jessica", 17, "female")
> person_instance.printIt
> person_instance =3D Person.new("Marc", 60, "male")
> person_instance.printIt
> person_instance =3D Person.new("Linda", 56, "female")
> person_instance.printIt
>=20
> end


Your example is quite unusual.  The scope of the 'person_instance' =
variable is only going to be within your class definition of Person.  =
Basically you are creating several instances but then discarding any =
reference to them.  After the 'end' that terminates the Person =
definition 'person_instance' won't be defined and so the instance won't =
be accessible.

It is important to realize that Ruby class definitions are actually =
executable code. The code within the class..end block is executed in the =
order it is written so that by the time you get to your "Person.new" =
calls, the class is defined as well as 'initialize' and 'printit' so =
there isn't anything magical going on when you call Person.new.

Note, that if you moved your Person.new calls to between the definition =
of initialize and printIt, they would fail because they would be =
executed before printIt was defined.

Gary Wright