From: mame@... Date: 2019-12-18T01:20:43+00:00 Subject: [ruby-core:96295] [Ruby master Bug#16430] Resultion of constants in enclosing class/module affected by how nested classes/modules are declared Issue #16430 has been updated by mame (Yusuke Endoh). Status changed from Open to Rejected It is by design. See "Scope" section of https://github.com/ruby/ruby/blob/master/doc/syntax/modules_and_classes.rdoc ---------------------------------------- Bug #16430: Resultion of constants in enclosing class/module affected by how nested classes/modules are declared https://bugs.ruby-lang.org/issues/16430#change-83200 * Author: MikeVastola (Mike Vastola) * Status: Rejected * Priority: Normal * Assignee: * Target version: * ruby -v: ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux] * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN ---------------------------------------- I'm not sure if this is intentional (in which case it really isn't documented anywhere, and probably should be) or a bug, but imagine the following code: ``` ruby # lib/a.rb module A FOO = :BAR end # lib/a/b.rb require_relative '../a' module A::B def foo FOO end end # lib/a/c.rb require_relative '../a' module A module C def foo FOO end end end ``` If I were to evaluate `A::B.foo`, I would trigger a `NoMethodError (undefined method 'foo' for A::B:Module)`. However, if I were to evaluate `A::C.foo`, I would get `:BAR`. This was really confusing to debug because I've been writing the more compact syntax forever where possible without realizing it impacted variable resolution, and it seems kind of bizarre and counter-intuitive that it would work this way. * * * * Also, playing with this a bit more, there are some really weird artifacts going on: apparently different methods within the same class/module can have different nestings depending on the context in which they were added to the class? For example: ``` ruby module A X = 1 end module A::B X = 6 end module A module B::C Y = 9 Z = X + Y # 10 end end module A::B module C N = X + Y # 15 end end ``` -- https://bugs.ruby-lang.org/ Unsubscribe: