From: "alexeymuranov (Alexey Muranov)" Date: 2012-07-29T20:27:11+09:00 Subject: [ruby-core:46853] [ruby-trunk - Bug #6810] `module A::B; end` is not equivalent to `module A; module B; end; end` with respect to constant lookup (scope) Issue #6810 has been updated by alexeymuranov (Alexey Muranov). fxn (Xavier Noria) wrote: > I cannot tell you the ultimate rationale behind this, but I can tell you that with the current semantics that is not well-defined. > > The problem is that nesting stores module objects, not constant names. Consider for example: > > module M > end > > module A > B = M > end > > module A::B > Module.nesting # => [M] > end > > See? No trace of A. > > Constants and class and module objects are very decoupled, they are mostly orthogonal concepts in Ruby except for name assignment and some convenient things provided by the class and module keywords. Thanks for the example. I do not see however that constants and modules be decoupled: there is `Module#name` method, so what would be wrong with deriving `Module::nesting` from the innermost module name? Can an anonymous module ever appear in a nesting? ---------------------------------------- Bug #6810: `module A::B; end` is not equivalent to `module A; module B; end; end` with respect to constant lookup (scope) https://bugs.ruby-lang.org/issues/6810#change-28529 Author: alexeymuranov (Alexey Muranov) Status: Open Priority: Normal Assignee: Category: core Target version: ruby -v: ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin10.8.0] =begin Is this the expected behavior? To me it is rather surprising: N = 0 module A module B def self.f; N; end end N = 1 end A::B.f # => 1 but N = 0 module A; end module A::B def self.f; N; end end module A N = 1 end A::B.f # => 0 Even more striking: module A module B def self.f; N; end end end N = 0 A::B.f # => 0 A::N = 1 puts A::B.f # => 1 A::B::N = 2 A::B.f # => 2 but module A; end module A::B def self.f; N; end end N = 0 A::B.f # => 0 A::N = 1 A::B.f # => 0 A::B::N = 2 A::B.f # => 2 =end -- http://bugs.ruby-lang.org/