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?

@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

···

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

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

@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

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 http://www.ruby-doc.org/docs/\. I can't say which ones can be
more useful, though.

Stefano

···

On Sunday 29 November 2009, Ralph Shnelvar wrote:

>> 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?
>
>> @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.
>
>> 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, SC> @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 SC> example. defined?($xyzzy) should have given you
> "global-variable".
>
>> I hope this helps
>
>> 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?
>