From: alexey.muranov@... Date: 2014-05-18T13:17:31+00:00 Subject: [ruby-core:62661] [ruby-trunk - Feature #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 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/