Created
December 16, 2009 19:23
-
-
Save wilson/258096 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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