From: Josh Cheek Date: 2011-06-02T08:16:40+09:00 Subject: Re: instance variable in pseudo-global scope --0016e64c1848e7af3d04a4aeb2e6 Content-Type: text/plain; charset=ISO-8859-1 On Wed, Jun 1, 2011 at 2:37 PM, Sean O'Halpin wrote: > On Wed, Jun 1, 2011 at 6:01 PM, Chad Perrin wrote: > > As I understand things: > > > > * Variables whose names have no leading sigil have local scope. > > > > * Instance variables are local scope for the particular instance of a > > class within which they "live". > > > > * A Ruby program's "global" scope is actually the scope of an instance of > > Object (or, under certain circumstances, maybe it could be an instance > > of something further down the class inheritance hierarchy . . . ?). > > > > As such, it seems that within your program's "global" scope (not truly > > global, but close enough for government work in most cases), the > > effective difference between variables named foo and @foo is nothing but > > one character. Is there some technical difference that might have an > > effect on the "behavior"[0] of the code I write, as long as neither of > > them is being exported to some other running code or enclosed in a more > > restricted scope within my program? > > > > ## NOTES > > > > [0]: Someone actually flamed me for referring to the "behavior" of some > > code, once upon a time -- thus the scare quotes around behavior in this > > case. > > > > -- > > Chad Perrin [ original content licensed OWL: http://owl.apotheon.org ] > > > > Well, @vars in main are visible to methods defined in main. For example: > > @foo = 1 > foo = 1 > > def bar > @foo = 10 > end > > def baz > foo = 10 > end > > bar > baz > > p @foo # => 10 > p foo # => 2 > > Is that the kind of difference you're interested in? > > Regards, > Sean > > You will get 10 and 1 as output, not 10 and 2. I think everyone knows how the local var works, so it's not that interesting. I think what is much more interesting is the instance var will change depending on who invokes the foo method. @foo = 1 def bar @foo = 10 end class C @foo # => nil # !> instance variable @foo not initialized bar @foo # => 10 end @foo # => 1 So no, its not that global. But TBH, I'm not sure how I feel about defining methods and instance vars in main, there are a number of quirky behaviours like this. I I've started to opt for defining them on main's singleton_class, unless I really do want them to be "global", which, on any decently sized project, isn't very common. --0016e64c1848e7af3d04a4aeb2e6--