Skip to content

Instantly share code, notes, and snippets.

@avdi
Forked from jcoglan/Ruby.markdown
Created February 18, 2013 20:09
Show Gist options
  • Save avdi/4980251 to your computer and use it in GitHub Desktop.
Save avdi/4980251 to your computer and use it in GitHub Desktop.

Core ideas

  • An Object is a set of instance variables and a pointer to a 'singleton class'.
  • Properties are looked up in the instance variables, methods are dispatched via the singleton class.
  • Module is a subtype of Object. A Module is a set of methods and an ordered list of zero-or-more 'parent' modules.
  • Module A becomes a parent of module B via B.include(A).
  • Method lookup works by doing a depth-first right-to-left search of a module tree.
  • Class is a subtype of Module. A Class is a Module that can be instantiated.
  • A Class has only one 'superclass'. A class includes its superclass as its first parent module for the purposes of method dispatch. A class's singleton class includes the superclass's singleton class as its first parent.
  • The default superclass of all classes is Object.
  • Object includes the Kernel module as a parent.

Warts

  • Although Class is a subtype of Module, you cannot call B.include(A) if A is a Class.
  • Singleton classes are not really classes. You cannot instantiate or inherit from them.

Sugar

  • obj.extend(M) is sugar for obj.singleton_class.include(M).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment