Constant lookup

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?

···

--
Posted via http://www.ruby-forum.com/\.