semantics of @x v. $x

R

Ralph Shnelvar

Newbie here:

Consider
irb(main):001:0> @xyzzy = 5
=> 5
irb(main):002:0> defined? @xyzzy
=> "instance-variable"
irb(main):003:0> $xyzzy = 5
=> 5
irb(main):004:0> defined? $xyzzy


What, semantically, is the difference between $x and @x when at top
level? (Am I at top level?)

Do $xyzzy and @xyzzy have global scope at statement 5 and beyond?
 
S

Stefano Crocco

|Newbie here:
|
|Consider
|irb(main):001:0> @xyzzy = 5
|=> 5
|irb(main):002:0> defined? @xyzzy
|=> "instance-variable"
|irb(main):003:0> $xyzzy = 5
|=> 5
|irb(main):004:0> defined? $xyzzy
|
|
|What, semantically, is the difference between $x and @x when at top
|level? (Am I at top level?)
|
|Do $xyzzy and @xyzzy have global scope at statement 5 and beyond?
|

@xyzzy = 5 defines an instance variable for the global object. That instance
variable is accessible only from the top level. $xyzzy = 5, instead, defines a
global variable, which can be accessed from everywhere.

Here's an example:

@x = 1
$y = 2

class C

def test
p defined?(@x)
p defined?($y)
p @x
p $y
end

end

C.new.test

The output is:

nil
"global-variable"
nil
2

This shows that, while $y can be accessed even from instances of the C class,
@x is accessible only from top level, that is only from the main object.

By the way, I suspect you forgot to paste a last line of output in your
example. defined?($xyzzy) should have given you "global-variable".

I hope this helps

Stefano
 
R

Ralph Shnelvar

SC> @xyzzy = 5 defines an instance variable for the global object. That instance
SC> variable is accessible only from the top level. $xyzzy = 5, instead, defines a
SC> global variable, which can be accessed from everywhere.

SC> Here's an example:

SC> @x = 1
SC> $y = 2

SC> class C
SC>
SC> def test
SC> p defined?(@x)
SC> p defined?($y)
SC> p @x
SC> p $y
SC> end
SC>
SC> end

SC> C.new.test

SC> The output is:

SC> nil
SC> "global-variable"
SC> nil
SC> 2

SC> This shows that, while $y can be accessed even from instances of the C class,
SC> @x is accessible only from top level, that is only from the main object.

SC> By the way, I suspect you forgot to paste a last line of output in your
SC> example. defined?($xyzzy) should have given you "global-variable".

SC> I hope this helps

SC> Stefano

I thank you greatly for you explanation and your time.

Is there a document that you know of that describes these scoping
rules for beginners?
 
S

Stefano Crocco

|SC> On Sunday 29 November 2009, Ralph Shnelvar wrote:
|>> |Newbie here:
|>> |
|>> |Consider
|>> |irb(main):001:0> @xyzzy = 5
|>> |=> 5
|>> |irb(main):002:0> defined? @xyzzy
|>> |=> "instance-variable"
|>> |irb(main):003:0> $xyzzy = 5
|>> |=> 5
|>> |irb(main):004:0> defined? $xyzzy
|>> |
|>> |
|>> |What, semantically, is the difference between $x and @x when at top
|>> |level? (Am I at top level?)
|>> |
|>> |Do $xyzzy and @xyzzy have global scope at statement 5 and beyond?
|
|SC> @xyzzy = 5 defines an instance variable for the global object. That
| instance SC> variable is accessible only from the top level. $xyzzy = 5,
| instead, defines a SC> global variable, which can be accessed from
| everywhere.
|
|SC> Here's an example:
|
|SC> @x = 1
|SC> $y = 2
|
|SC> class C
|SC>
|SC> def test
|SC> p defined?(@x)
|SC> p defined?($y)
|SC> p @x
|SC> p $y
|SC> end
|SC>
|SC> end
|
|SC> C.new.test
|
|SC> The output is:
|
|SC> nil
|SC> "global-variable"
|SC> nil
|SC> 2
|
|SC> This shows that, while $y can be accessed even from instances of the C
| class, SC> @x is accessible only from top level, that is only from the
| main object.
|
|SC> By the way, I suspect you forgot to paste a last line of output in
| your SC> example. defined?($xyzzy) should have given you
| "global-variable".
|
|SC> I hope this helps
|
|SC> Stefano
|
|I thank you greatly for you explanation and your time.
|
|Is there a document that you know of that describes these scoping
|rules for beginners?
|

Well, these are among the basics of ruby, so any introduction to ruby should
explain them. You can find the free version of Programming Ruby at
http://www.ruby-doc.org/docs/ProgrammingRuby (it's a bit old, but is mostly
still valid). Then, there are a number of other documentation for beginners
mentioned here http://www.ruby-doc.org/docs/. I can't say which ones can be
more useful, though.

Stefano
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,236
Members
46,825
Latest member
VernonQuy6

Latest Threads

Top