Skip to content

Instantly share code, notes, and snippets.

@yaquawa
Created July 7, 2019 09:47
Show Gist options
  • Save yaquawa/51fd36b22c00a77850f517a8a8f68325 to your computer and use it in GitHub Desktop.
Save yaquawa/51fd36b22c00a77850f517a8a8f68325 to your computer and use it in GitHub Desktop.
Decode Ruby's constant lookup with example
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment