Issue #6810 has been updated by Alexey Muranov.


After not doing any Ruby for a while, i find it hard again to recall or figure out the constant visibility and inheritance rules.

**I know this would be a major change, but maybe somehow the rules for the constants can be made identical to the rules for methods?**  That is, a constant would be essentially a method that always returns the same thing.

(I have not thought enough to figure out how many incompatibilities this would cause, but this would be easy to remember and understand IMO.)

----------------------------------------
Feature #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-46796

* Author: Alexey Muranov
* Status: Assigned
* Priority: Low
* Assignee: Yukihiro Matsumoto
* Category: core
* Target version: Next Major
----------------------------------------
=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



-- 
https://bugs.ruby-lang.org/