Forum: Ruby Constant lookup

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Adam G. (Guest)
on 2009-04-12 22:13
I've come across an odd issue when using a constant that is defined
within more than one module namespace. I've searched this
forum/ml/newsgroup for some answers, but I didn't come across anything
that quite addressed the situation I'm seeing.

Can anyone explain why this occurs? Is it supposed to? It doesn't make a
ton of sense to me.

> module Z
>   class A
>     def initialize
>       puts "Z::A"
>     end
>   end
>   module Y
>     module X
>       class A
>         def initialize
>           puts "Z::Y::X::A"
>         end
>       end
>     end
>     class B
>       include X
>       def initialize
>         puts "Z::Y::B"
>         @a = A.new
>       end
>     end
>   end
> end
>
> Z::A.new
Z::A
=> #<Z::A:0x573dc>
>
> Z::Y::X::A.new
> Z::Y::X::A
=> #<Z::Y::X::A:0x5030c>
>
> Z::Y::B.new
Z::Y::B
Z::A
=> #<Z::Y::B:0x48e18 @a=#<Z::A:0x48dc8>>
>
> Z::Y::B.const_get("A")
=> Z::Y::X::A

> module Z
>   module Y
>     class B
>       const_get("A")
>     end
>   end
> end
=> Z::Y::X::A
>
> module Z
>   module Y
>     class B
>       A
>     end
>   end
> end
=> Z::A

It seems to me, though obviously I'm wrong, that the bare constant 'A'
should evaluate to exactly the same thing as self.const_get("A").

In the mean time, I'll just rename my constants to non-conflicting
names, but... why is this working this way in the first place?
This topic is locked and can not be replied to.