Skip to content

Instantly share code, notes, and snippets.

@wilson
Created December 16, 2009 19:23
Show Gist options
  • Save wilson/258096 to your computer and use it in GitHub Desktop.
Save wilson/258096 to your computer and use it in GitHub Desktop.
# shortcut method for opening a metaclass on the receiver
module Kernel;def m;class << self;self;end;end;end
Module.m # #<Class:Module>, metaclass of Module
Module.m.superclass # Class, because that is how Module is bootstrapped
Module.m.m # #<Class:#<Class:Module>>, metaclass of Module's metaclass
Module.m.superclass # #<Class:#<Class:Module>>
Module.m.m.superclass # #<Class:#<Class:Module>>
# Opening a metaclass on Module's metaclass changes its superclass to be the same as its metaclass's superclass!?
# the same behavior occurs at arbitarily deep meta-levels:
Object.m.superclass # Class
Object.m.m.superclass # #<Class:#<Class:Object>>
Object.m.superclass # #<Class:#<Class:Object>>
# opening a third metaclass modifies the superclass of 'm.m', but leaves 'm' alone
Object.m.m.m # #<Class:#<Class:#<Class:Object>>>
Object.m.m.superclass # #<Class:#<Class:#<Class:Object>>>
Object.m.m.m.superclass # #<Class:#<Class:#<Class:Object>>>
Object.m.superclass # #<Class:#<Class:Object>>
# same deal for regular old Object instances, vs. classes and modules
o = Object.new # #<Object:0x101168440>
o.m # #<Class:#<Object:0x101168440>>
o.m.superclass # #<Class:Object> (at this point the superclass is Object's metaclass)
o.m.m # #<Class:#<Class:#<Object:0x101168440>>> (meta-metaclass of o)
# ...and now the superclass of meta and the superclass of meta-meta are the same:
o.m.superclass # #<Class:#<Class:#<Object:0x101168440>>>
o.m.m.superclass # #<Class:#<Class:#<Object:0x101168440>>>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment