From: Stefano Crocco Date: 2009-11-30T06:15:16+09:00 Subject: Re: semantics of @x v. $x On Sunday 29 November 2009, Ralph Shnelvar wrote: > |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