On Mon, 20 Feb 2006 15:22:04 +0100, Tony Mobily <merc / mobily.com> wrote:

> Hello,
>
> Thanks to the code in attach, I've figured out what is now completely  
> obvious to me:
>
> CLASS VARIABLE (@@something)
> - Inherited by subclasses
> - SAME ALLOCATION: If it's changed in Child, then it will change in  
> Parent
>
> CONSTANTS (Something)
> - Inherited by subclasses
> - PRIVATE ALLOCATION: If it's changed in Child, it will NOT change in  
> parent
>
> CLASS INSTANCE VARIABLES (@something)
> - NOT Inherited by subclasses. They will simply be nil. Scope = Class
> - DIFFERENT ALLOCATION: If it's changed in Child, it will NOT change in  
> parent

But there is more fun when singleton classes get involved:

class A
   @@var = :A
   C = :CA
end

class B
   @@var = :B
   C = :CB

   a = A.new
   class ::A
     p [@@var, C] # => [:A, :CA]
     def foo
       [@@var, C]
     end
   end
   def a.bar
     [@@var, C]
   end
   class << a
     p [@@var, C] # => [:B, :CB]
     def baz
       [@@var, C]
     end
   end
   p a.foo # => [:A, :CA]
   p a.bar # => [:B, :CB]
   p a.baz # => [:B, :CB]
   p [@@var, ::A::C, C, class << a;C;end] # => [:B, :CA, :CB, :CB]
   class << a
     @@var = :ASing # this changes B's @@var [*]
     C = :CASing # this creates a new C for a's sing. class
   end
   p [@@var, ::A::C, C, class << a;C;end] # => [:ASing, :CA, :CB, :CASing]
   p a.foo # => [:A, :CA]
   p a.bar # => [:ASing, :CB]
   p a.baz # => [:ASing, :CASing]
end

Some points:
- singleton classes don't have their own class variables, but they can  
have their own constants
- constant and class var lookup use the lexical scope, so it depends  
"where" you do something (that's why bar's C and baz's C are different)
- (lexical) singleton-class-scopes are skipped when accessing class vars  
(that's why [*] changes B's @@var and not A's @@var)

I hope that helps and doesn't totally confuse you ;-)

Dominik