[ruby-core:118466] [Ruby master Feature#20609] Nested module namespace misses fallback to top level
From:
"jeremyevans0 (Jeremy Evans) via ruby-core" <ruby-core@...>
Date:
2024-07-06 17:32:12 UTC
List:
ruby-core #118466
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/
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/