La Búsqueda de Constantes

Cuando se referencia una constante sin cualificar su espacio de nombres el intérprete Ruby busca por la definición apropiada de la constante.

  1. Intenta resolver la constante en el ámbito local en el que ocurre la referencia
  2. Si no, busca en el siguiente módulo o clase que anida en su ámbito la referencia a la constante
  3. Esto continúa hasta que no hay mas clases o módulos que encierren a la referencia
  4. Si no se encuentra la constante se pasa a buscar en la jerarquía de herencia
  5. Si no se encuentra se buscan en las constantes globales
  6. Si no se encuentra se llama al método const_missing

  1. El método de clase Module.nesting retorna la lista de clases y módulos que serán buscados en el orden de búsqueda
  2. El método ancestors (definido en la clase Module) de una clase o módulo retorna la lista de clases y módulos que serán buscados después que la búsqueda por ámbito fracase

module Kernel
  # Constants defined in Kernel
  A = B = C = D = E = F = "defined in kernel"
end

# Top-level or "global" constants defined in Object
A = B = C = D = E = "defined at toplevel"

class Super
  # Constants defined in a superclass
  A = B = C = D = "defined in superclass"
end

module Included
  # Constants defined in an included module
  A = B = C = "defined in included module"
end

module Enclosing
  # Constants defined in an enclosing module
  A = B = "defined in enclosing module"

  class Local < Super
    include Included

    # Locally defined constant
    A = "defined locally"

    # The list of modules searched, in the order searched
    # [Enclosing::Local, Enclosing, Included, Super, Object, Kernel]
    search = (Module.nesting + self.ancestors + Object.ancestors).uniq

    puts A  # Prints "defined locally"
    puts B  # Prints "defined in enclosing module"
    puts C  # Prints "defined in included module"
    puts D  # Prints "defined in superclass"
    puts E  # Prints "defined at toplevel"
    puts F  # Prints "defined in kernel"
  end
end

Casiano Rodriguez León 2015-06-18