Issue #11294 has been updated by Andrew Kozin.


Thank you, Nobuyoshi, for your answering.

Now I see the reason, but IMHO this behaviour is a bit perplexing.

I think it still be useful to have a "strict" version of `Object.get_const` that would treat the namespace literally with a syntax of sorts:

~~~
Object.get_const "Foo::Baz::Bar::Qux", strict: true
# => NameError: uninitialized constant Foo::Baz::Bar
~~~

----------------------------------------
Bug #11294: Possible bug in Object.const_get
https://bugs.ruby-lang.org/issues/11294#change-53088

* Author: Andrew Kozin
* Status: Rejected
* Priority: Normal
* Assignee: 
* ruby -v: 2.2
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN
----------------------------------------
~~~ruby
module Foo; end
module Foo::Baz; end
module Bar; end
module Bar::Qux; end

Object.const_get "Foo::Baz::Bar::Qux"
# => Bar::Qux
~~~

Why on earth it is found at all?
It seems pretty weird to me.

The real problem arises later, when I add `Foo::Bar::Qux`:

~~~ruby
module Foo::Bar; end
module Foo::Bar::Qux; end
~~~

then the tree becomes as following:

~~~ruby
Foo::Bar::Qux
Foo::Baz
Bar::Qux
~~~

But the result remains the same:

~~~ruby
Object.const_get "Foo::Baz::Bar::Qux"
# => Bar::Qux
~~~

Here I'd expect searching `"Foo::Baz::Bar::Qux"` to

* either return nothing (this is less astonished, because there is no such constant),
* or find the closest `Bar::Qux` to `Foo::Bar`, that is `Foo::Bar::Qux`, not the `Bar::Qux`

I cannot even understand the logic that follows the `Object.const_get` in providing such a result.




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