|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?
|