![]() |
question about class variables and instance variables
Hello,
I've some difficolties with instance variables and classe variables With : class A def foo @foo end def bar @@bar end end a = A.new --------- ------------ ------------ | | | | | | | a |--(instance_of)->-| A |--(instance_of)->-| Class | | | | | | | --------- ------------ ------------ a is an instance of A which itself is an instance of Class @foo is an instance variable, so it is stored in box "a" @@bar is a class variable, so it is stored in box "A" if I do something like the following : class A def A.strange @strange end end Where is stored my @strange ? I had the hypothesis that @strange in the "A" context was equivalent to @@strange in the "a" context but the following code prove me to be wrong : class A def A.strange @strange end def strange=( val ) @@strange = val end end a = A.new a.strange= 2 p A.strange # output is nil, not 2 Could someone explain me where to place this @strange ? in which box could I store it ? Thanks in advance -- Eric D. -- Posted via http://www.ruby-forum.com/. |
Re: question about class variables and instance variables
On Jan 31, 2006, at 11:29 AM, Eric D. wrote:
> I've some difficolties with instance variables and classe variables > > With : > > class A > def foo > @foo > end > def bar > @@bar > end > end > > a = A.new > > --------- ------------ ------------ > | | | | | | > | a |--(instance_of)->-| A |--(instance_of)->-| Class | > | | | | | | > --------- ------------ ------------ > > a is an instance of A which itself is an instance of Class > @foo is an instance variable, so it is stored in box "a" > @@bar is a class variable, so it is stored in box "A" > > > if I do something like the following : > > class A > def A.strange > @strange > end > end > > Where is stored my @strange ? I had the hypothesis that @strange in > the > "A" context was equivalent to @@strange in the "a" context but the > following code prove me to be wrong : > > class A > def A.strange > @strange > end > def strange=( val ) > @@strange = val > end > end > > a = A.new > a.strange= 2 > p A.strange # output is nil, not 2 > > > Could someone explain me where to place this @strange ? in which box > could I store it ? instance variables are always stored in the instance self. class variables are shared between a class, its instances, its subclasses and its subclass instances. Consider: class A @@a_1 = :one def initialize @@a_2 = :two end end A.new class B < A p @@a_1, @@a_2 @@b_1 = :three def initialize @@b_2 = :four end def print p @@a_1, @@a_2, @@b_1, @@b_2 end end class A x = @@b_1 rescue 'not found' y = @@b_2 rescue 'not found' p x, y end B.new.print -- Eric Hodel - drbrain@segment7.net - http://segment7.net This implementation is HODEL-HASH-9600 compliant http://trackmap.robotcoop.com |
Re: question about class variables and instance variables
On Jan 31, 2006, at 2:29 PM, Eric D. wrote: > Hello, > > I've some difficolties with instance variables and classe variables > > With : > > class A > def foo > @foo > end > def bar > @@bar > end > end > > a = A.new > > --------- ------------ ------------ > | | | | | | > | a |--(instance_of)->-| A |--(instance_of)->-| Class | > | | | | | | > --------- ------------ ------------ > > a is an instance of A which itself is an instance of Class > @foo is an instance variable, so it is stored in box "a" > @@bar is a class variable, so it is stored in box "A" > > > if I do something like the following : > > class A > def A.strange > @strange > end > end > > Where is stored my @strange ? I had the hypothesis that @strange in > the > "A" context was equivalent to @@strange in the "a" context but the > following code prove me to be wrong : > > class A > def A.strange > @strange > end > def strange=( val ) > @@strange = val > end > end > > a = A.new > a.strange= 2 > p A.strange # output is nil, not 2 > > > Could someone explain me where to place this @strange ? in which box > could I store it ? > > > > > Thanks in advance > -- > Eric D. > > -- > Posted via http://www.ruby-forum.com/. > Classes are objects too. @strange is an instance variable of the object A (which has class, Class). @@strange is a class variable of the class A. The difference is that instances of A can peek at the class vars. They can't peek at A's instance vars. They are in two separate namespaces. The other difference is that class variables aren't so much class variables as they are class hiearchy vars. EG: class A @@strange = 1 end class B < A puts @@strange end #prints 1 class C @strange = 1 end class D < C puts @strange end # prints nil |
Re: question about class variables and instance variables
On 2006-01-31, Eric Hodel <drbrain@segment7.net> wrote:
> class variables are shared between a class, its instances, its > subclasses and its subclass instances. Is this really the whole story? Because until now I always thought I didn't understand class variables but if this is so then now I do. Wheeeee! But there's at least one gotcha; a class variable shadows any class variable of the same name that you subsequently create in an ancestor class: $ irb irb(main):001:0> class A ; end ; class B < A ; end => nil irb(main):002:0> class B ; @@x = 1 ; end ; class A ; @@x = 0 ; end => 0 irb(main):003:0> class A ; puts @@x ; end ; class B ; puts @@x ; end 0 1 => nil irb(main):004:0> exit .... but if you create the class variable in the ancestor class first then the descendant class inherits it instead of creating a new one: $ irb irb(main):001:0> class A ; end ; class B < A ; end => nil irb(main):002:0> class A ; @@x = 0 ; end ; class B ; @@x = 1 ; end => 1 irb(main):003:0> class A ; puts @@x ; end ; class B ; puts @@x ; end 1 1 => nil irb(main):004:0> exit Any other subtleties? Cheers, Jeremy Henty |
| All times are GMT. The time now is 06:47 PM. |
Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.