From: ronnie@... Date: 2019-05-24T23:02:27+00:00 Subject: [ruby-core:92833] [Ruby trunk Bug#15875] const_defined? behavior inconsistency in 2.6.x series Issue #15875 has been updated by matsuda (Akira Matsuda). ### 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 `
' -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 ``` ---------------------------------------- Bug #15875: const_defined? behavior inconsistency in 2.6.x series https://bugs.ruby-lang.org/issues/15875#change-78211 * Author: matsuda (Akira Matsuda) * Status: Open * Priority: Normal * Assignee: * Target version: * ruby -v: 2.6.1, 2.6.2, 2.6.3 * Backport: 2.4: UNKNOWN, 2.5: UNKNOWN, 2.6: UNKNOWN ---------------------------------------- `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 `
' [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 `
': uninitialized constant A::B (NameError) ``` -- https://bugs.ruby-lang.org/ Unsubscribe: