Bug #10488
Updated by nobu (Nobuyoshi Nakada) about 10 years ago
Currently, if for some module `mod` and constant `Const`, `mod.const_defined?(:Const)` is true does not imply `mod::Const` is not an error. This is inconsistent for at least the following cases: * if mod is a Module but not a class, `const_defined?` const_defined? will look in `Object` Object and its ancestors, but constant access (::) will not look in `Object` Object or above. ~~~ruby Enumerable.const_defined? :String Enumerable::String #=> NameError: uninitialized constant Enumerable::String * if `Const` Const is private, `const_defined?` const_defined? will return true while `mod::Const` mod::Const will raise an error. ~~~ruby C = 42 Object.private_constant :C String.const_defined? :C #=> true String::C #=> NameError: private constant String::C referenced # This works, but is due to the lexical scope lookup class String C #=> 42 end Is this intended? Should it not mirror the behavior of `defined?(mod::Const)`? defined?(mod::Const)? Or the behavior of `method_defined?` method_defined?