Scope of an @variable

I've got a class. I want some methods of this class to be able to edit
some data that's "global" within any given instance of this class. For
example:

class Person

   @name

   def changeName(newName)
      @name = newName
   end

   def sayName()
      puts "My name is " + @name
   end
end

It seems that @name reverts back once I leave the scope of any method
that manipulates it.

···

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

you need to use @@name.

···

On 3/14/06, Nathan Olberding <nathan.olberding@gmail.com> wrote:

I've got a class. I want some methods of this class to be able to edit
some data that's "global" within any given instance of this class. For
example:

class Person

   @name

   def changeName(newName)
      @name = newName
   end

   def sayName()
      puts "My name is " + @name
   end
end

It seems that @name reverts back once I leave the scope of any method
that manipulates it.

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

Hi --

I've got a class. I want some methods of this class to be able to edit
some data that's "global" within any given instance of this class. For
example:

class Person

  @name

  def changeName(newName)
     @name = newName
  end

  def sayName()
     puts "My name is " + @name
  end
end

It seems that @name reverts back once I leave the scope of any method
that manipulates it.

As you've learned from some of the other responses, @name is an
instance variable. Each instance variable belongs to one object. You
can always tell *which* object: it's whatever the default object
(self) is, at the point where the "@var" is executed.

Note that self changes between a class definition and an instance
method definition:

   class Person
     puts self
     def some_method
       puts self
     end
   end

   Person.new.some_method

This code will give you:

   Person
   #<Person:0x352814>

In the top level of the class definition, self is the actual class
object (Person), but inside an instance method, it's the instance
(indicated by the #<Person...> expression).

So... @name in the outer scope is actually an instance variable
belonging to the class object, while inside any instance method, @name
is an instance variable belonging to the instance. The two @name's
have no connection to each other at all.

You can use class variables to get a variable that can be seen in both
scopes, but if you've got a property like "name" and you find yourself
manipulating it outside of any instance method, something's probably
in need of tweaking in the program design (since the name of any
particular instance shouldn't be of concern at the class level).

David

···

On Wed, 15 Mar 2006, Nathan Olberding wrote:

--
David A. Black (dblack@wobblini.net)
Ruby Power and Light, LLC (http://www.rubypowerandlight.com)

"Ruby for Rails" chapters now available
from Manning Early Access Program! Ruby for Rails

Adam Shelly wrote:

you need to use @@name.

I was under the impression (newbie alert) that @name was for instances
and @@name was for classes as a whole (ie, @@ variables change that
value in all instances of Class). Is there a way to have variables that
apply to all instances of a Class?

···

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

dblack@wobblini.net wrote:

Note that self changes between a class definition and an instance
method definition:

Light bulbs floating above list readers' heads around the world just illuminated.

Thanks for the great explanation!

--Steve

Use an initialize method:

class Person
   def initialize(name="Anonymous")
     @name = name
   end
   attr_accessor :name
   def to_s
     "My name is #{@name}"
   end
end

person = Person.new
puts person # -> My name is Anonymous
person.name = "Fred"
puts person # -> My name is Fred

This should help you: Programming Ruby: The Pragmatic Programmer's Guide

-- Daniel

···

On Mar 14, 2006, at 11:18 PM, Nathan Olberding wrote:

I was under the impression (newbie alert) that @name was for instances
and @@name was for classes as a whole (ie, @@ variables change that
value in all instances of Class). Is there a way to have variables that
apply to all instances of a Class?

Oops, I read the question too quickly. Sorry. David Black has the
right explanation.
-Adam

···

On 3/14/06, Nathan Olberding <nathan.olberding@gmail.com> wrote:

Adam Shelly wrote:
> you need to use @@name.

I was under the impression (newbie alert) that @name was for instances
and @@name was for classes as a whole (ie, @@ variables change that
value in all instances of Class). Is there a way to have variables that
apply to all instances of a Class?