Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Scope of an @variable

Reply
Thread Tools

Scope of an @variable

 
 
Nathan Olberding
Guest
Posts: n/a
 
      03-14-2006
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/.


 
Reply With Quote
 
 
 
 
Adam Shelly
Guest
Posts: n/a
 
      03-14-2006
you need to use @@name.

On 3/14/06, Nathan Olberding <(E-Mail Removed)> 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 =3D 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/.
>
>



 
Reply With Quote
 
 
 
 
Nathan Olberding
Guest
Posts: n/a
 
      03-14-2006
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/.


 
Reply With Quote
 
Daniel Harple
Guest
Posts: n/a
 
      03-14-2006

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?


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: http://ruby-doc.org/docs/ProgrammingRuby

-- Daniel


 
Reply With Quote
 
dblack@wobblini.net
Guest
Posts: n/a
 
      03-15-2006
Hi --

On Wed, 15 Mar 2006, Nathan Olberding 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.


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

--
David A. Black ((E-Mail Removed))
Ruby Power and Light, LLC (http://www.rubypowerandlight.com)

"Ruby for Rails" chapters now available
from Manning Early Access Program! http://www.manning.com/books/black


 
Reply With Quote
 
Stephen Waits
Guest
Posts: n/a
 
      03-15-2006
http://www.velocityreviews.com/forums/(E-Mail Removed) 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



 
Reply With Quote
 
Adam Shelly
Guest
Posts: n/a
 
      03-15-2006
On 3/14/06, Nathan Olberding <(E-Mail Removed)> 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?


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


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: Lexical scope vs. dynamic scope Xah Lee Java 0 02-26-2009 10:08 AM
CSPEC issue: lossing scope (or incorrect scope) in cspec subroutine. balldarrens@gmail.com Perl Misc 0 02-05-2009 08:42 PM
Scope - do I need two identical classes, each with different scope? ann Java 13 09-13-2005 03:07 AM
How do namespace scope and class scope differ? Steven T. Hatton C++ 9 07-19-2005 06:07 PM
IMPORT STATIC; Why is "import static" file scope? Why not class scope? Paul Opal Java 12 10-10-2004 11:01 PM



Advertisments