Semantics of @x v. $x

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?

On Sunday 29 November 2009, Ralph S. wrote:

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

SC> On Sunday 29 November 2009, Ralph S. wrote:

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

On Sunday 29 November 2009, Ralph S. wrote:

|>> |irb(main):004:0> defined? $xyzzy
| everywhere.
|SC> p defined?($y)
|SC> nil
| “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
Programming Ruby: The Pragmatic Programmer's Guide (it’s a bit old, but is
mostly
still valid). Then, there are a number of other documentation for
beginners
mentioned here Ruby-Doc.org: Documenting the Ruby Language. I can’t say which ones can
be
more useful, though.

Stefano