Project

General

Profile

Actions

Bug #10488

closed

Consistency of Module#const_defined? and constant lookup

Added by Eregon (Benoit Daloze) about 10 years ago. Updated about 10 years ago.

Status:
Closed
Assignee:
-
Target version:
ruby -v:
ruby 2.2.0dev (2014-10-12 trunk 47890) [x86_64-darwin13]
Backport:
[ruby-core:66145]

Description

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? will look in Object and its ancestors, but constant access (::) will not look in Object or above.

    Enumerable.const_defined? :String
    Enumerable::String #=> NameError: uninitialized constant Enumerable::String
    
    
  • if Const is private, const_defined? will return true while mod::Const will raise an error.

    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)?
Or the behavior of method_defined?

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0