Thanks Christoph, the tests (test_variable.rb) help a lot. I guess the main
reason for the current mechanism is to allow the singleton methods
Gods.ruler1 and Gods.ruler2 to find the Gods @@rule variable. The
'intuitive' rule wouldn't allow that.

Thanks everyone for taking the time to explain this. Promised wiki page will
appear this weekend!

-- George

> -----Original Message-----
> From: Christoph [mailto:chr_news / gmx.net]
> Sent: 11 November 2003 18:54
> To: ruby-core / ruby-lang.org
> Subject: Re: Class variable and singleton problem
> 
> 
> George marrows wrote:
> ...
> > Thanks to you and Guy, I think I now understand what it's 
> > doing - we could call it the 'surrounding class then 
> > inheritance hierarchy' rule.
> > 
> > .. but I'm afraid I'm still not clear on *why* this rule is 
> > used, in particular how it helps to 'make scope resolution as 
> > static as possible'.
> > Could you provide an example? 
> 
> You can find an example on why this probably a good idea  in 
> test.rb located in the  sample directory of Ruby's source tree - grep
> for "Titans" - (just image the morass of extra rules you 
> would need to 
> define to resolve this example if you start of with  a simple
> ``intuitive'' lookup rule).
> To throw in a little history, Ruby once had more ``intuitive'' and 
> seemingly simpler class variable scoping rules. However, because of
> their inconstancies they were dropped, and new rules were adopted
> modeled more closely around the constant scoping rules (static scope)
> - not however in contrast to the former that singleton classes are 
> not valid scopes  (see Guy's post) for class variables.
>  
> > All I see at the moment is that the rule introduces a (to me) 
> > unintuitive special case for singleton methods: in Mark's 
> > example, o is effectively a subclass of A, so it seems 
> > strange it can't directly access its class vars.
> > (See the ongoing ruby-talk discussion about objects with 
> > singleton methods still being examples of their 'original' class..)
> >
> > Thanks again for taking the time to explain. I'll write this 
> > up on the wiki when we're done.
> 
> Here is another ``weird'' example for your wiki.
> 
> ---
> class A
>   @@var = :A
> end
> 
> class B
>   @@var = :B
> end
> 
> class B
>   $a = A.new
>   def $a.var
>      @@var
>   end
> end
> 
> class A
>   $b = B.new
>   def $b.var
>     @@var
>   end
> end
> 
> p $a.var # :B
> p $b.var # :A
> ---
> 
> 
> /Christoph
> 
>