Well, that's interesting. Then this seems to be the only assignment that has side-effect on RHS, which I would argue nobody expects (or do you?). I think it makes more sense to do naming in class definition construct rather than to check whether RHS is an anonymous class on each constant assignment.

Hence I consider this a bug.

Tomas

-----Original Message-----
From: Marcel Molina Jr. [mailto:marcel / vernix.org]
Sent: Tuesday, October 16, 2007 11:21 AM
To: ruby-core / ruby-lang.org
Subject: Re: A couple of bugs?

On Wed, Oct 17, 2007 at 03:10:07AM +0900, Gavin Kistner wrote:
> From: John Lam (DLR) [mailto:jflam / microsoft.com]
> > 2. Bad side effect during global constant assignment:

At first glance I agree it looks like a bug but it's consistant behavior with
the way anonymous classes resolve their name.

> I think the following shows the bug slightly more clearly:
>
> class E
>   p name           #=> "E"
>   class << self
>     p name         #=> ""
>     Foo = self
>     p name         #=> ""
>     ::Foo = self
>     p name         #=> "Foo"

>   end
>   p name           #=> "E"
> end

The meta class of E is an anonymous class. So it does not have a name.

irb(main):005:0> class E
irb(main):006:1> end
=> nil
irb(main):007:0> class << E
irb(main):008:1> p self
irb(main):009:1> end
#<Class:E>

Assigning an anonymous class to a constant implicitly gives that class the
name of the constant. So since the meta class of E (which is anonymous) is
assigned to the outer Foo constant, it's given that name.

c = Class.new
=> #<Class:0x6c2d0c>
irb(main):002:0> c.name
=> ""
irb(main):003:0> Bar = c
=> Bar
irb(main):004:0> c.name
=> "Bar"

marcel
--
Marcel Molina Jr. <marcel / vernix.org>