Actions
Bug #15875
closedconst_defined? behavior inconsistency in 2.6.x series
Description
Module#const_defined?
returns true for unreachable nested fully qualified module name.
Here are the results of const_defined?
for each ruby version on my machine.
% ruby -e "module A; end; B = 1; p Object.const_defined?('A::B')"
[1.9.3-p551, 2.0.0-p648]
-e:1:in `const_defined?': wrong constant name A::B (NameError)
from -e:1:in `<main>'
[2.1.10, 2.2.10, 2.3.8, 2.4.6, 2.5.5, 2.6.0]
false
[2.6.1, 2.6.2, 2.6.3]
true
[2.7.0-dev (2019-05-25 trunk 559dca509d)]
false
For (2.6.1...2.6.3), it fails to reference the constant even though const_defined?
returns true. So IMO this should be const_defined?
's bug.
% ruby -e "module A; end; B = 1; p Object.const_defined?('A::B') && A::B"
-e:1:in `<main>': uninitialized constant A::B (NameError)
Updated by matsuda (Akira Matsuda) over 5 years ago
Side Note #1¶
const_get()
could get this constant for all released versions, but has been intentionally changed in 2.7. Correct?
% ruby -e "module A; end; B = 1; p Object.const_get('A::B')"
[1.9.3...2.6.3]
1
[2.7.0-dev (2019-05-25 trunk 559dca509d)]
Traceback (most recent call last):
1: from -e:1:in `<main>'
-e:1:in `const_get': uninitialized constant A::B (NameError)
Side Note #2¶
Current stable jruby seems to be following the 2.6 behavior.
% ruby -e "module A; end; B = 1; p Object.const_defined?('A::B')"
[jruby-9.2.7.0]
true
Updated by jeremyevans0 (Jeremy Evans) over 5 years ago
Bisected to bf8cc37b467e1d372e1b01b4d25e9ef6f8cc927f.
Backporting d10451f3fd51f577e704db770de48d05044eb45c to 2.6 fixes this bug.
Updated by nobu (Nobuyoshi Nakada) over 5 years ago
- Is duplicate of Bug #15758: Object.const_defined?(name) falsely returns true on classes that are not defined added
Updated by nagachika (Tomoyuki Chikanaga) over 5 years ago
- Status changed from Open to Closed
- Backport changed from 2.4: UNKNOWN, 2.5: UNKNOWN, 2.6: UNKNOWN to 2.4: DONTNEED, 2.5: DONTNEED, 2.6: REQUIRED
Updated by nagachika (Tomoyuki Chikanaga) almost 5 years ago
- Backport changed from 2.4: DONTNEED, 2.5: DONTNEED, 2.6: REQUIRED to 2.4: DONTNEED, 2.5: DONTNEED, 2.6: DONE
ruby_2_6 r67830 merged revision(s) e1b592b508c72a56ae012869d97fe1580ff87246,d10451f3fd51f577e704db770de48d05044eb45c.
Actions
Like0
Like0Like0Like0Like0Like0