[ruby-core:118465] [Ruby master Feature#20609] Nested module namespace misses fallback to top level

Issue #20609 has been reported by abdullah.arif (Abdullah Arif). ---------------------------------------- Feature #20609: Nested module namespace misses fallback to top level https://bugs.ruby-lang.org/issues/20609 * Author: abdullah.arif (Abdullah Arif) * Status: Open ---------------------------------------- Currently, Ruby falls back to the top-level constants if it cannot find the Module in the local scope. This can cause it to behave unintuitively. ```ruby module A module B MY_CONST = 'defined in A::B' end end module X end module X::Y # Ruby treats A::B the same as ::A::B, because module X::Y::A is not defined. IMO this should raise a Name error or atleast a warning. module A::B # This was meant to be scoped to X::Y::A::B' MY_CONST = 'defined in X::Y::A::B' end puts(::A::B::MY_CONST) # => defined in X::Y::A::B puts(A::B::MY_CONST) # => defined in X::Y::A::B end puts(X::Y::A::B::MY_CONST) # uninitialized constant X::Y::A (NameError) ``` I think Ruby should raise an error or atleast a clear warning explaining the module it is using has different nesting than what the coder might expect. -- https://bugs.ruby-lang.org/

Issue #20609 has been updated by jeremyevans0 (Jeremy Evans). This is expected. When you do: ```ruby module A::B end ``` Understand that in Ruby, this is a general form of: ```ruby module (expression)::B end ``` Ruby resolves `expression` (e.g. constant lookup for `A`), then defines a constant `B` under it. In your example: ```ruby module X::Y module A::B # (`expression`::B) where expression is A end end ``` The reference to `A` inside `X::Y` resolves to `::A` because `X::Y` does not define a constant named `A`. The idea that the above code should define `X::Y::A::B` cannot really work, because Ruby would have no knolwedge of whether to define `X::Y::A` as a module or as a class. ---------------------------------------- Feature #20609: Nested module namespace misses fallback to top level https://bugs.ruby-lang.org/issues/20609#change-108981 * Author: abdullah.arif (Abdullah Arif) * Status: Open ---------------------------------------- Currently, Ruby falls back to the top-level constants if it cannot find the Module in the local scope. This can cause it to behave unintuitively. ```ruby module A module B MY_CONST = 'defined in A::B' end end module X end module X::Y # Ruby treats A::B the same as ::A::B, because module X::Y::A is not defined. IMO this should raise a Name error or atleast a warning. module A::B # This was meant to be scoped to X::Y::A::B' MY_CONST = 'defined in X::Y::A::B' end puts(::A::B::MY_CONST) # => defined in X::Y::A::B puts(A::B::MY_CONST) # => defined in X::Y::A::B end puts(X::Y::A::B::MY_CONST) # uninitialized constant X::Y::A (NameError) ``` I think Ruby should raise an error or atleast a clear warning explaining the module it is using has different nesting than what the coder might expect. -- https://bugs.ruby-lang.org/
participants (2)
-
abdullah.arif (Abdullah Arif)
-
jeremyevans0 (Jeremy Evans)