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/