Skip to content

Instantly share code, notes, and snippets.

@yugui
Created December 9, 2008 16:47
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yugui/33963 to your computer and use it in GitHub Desktop.
Save yugui/33963 to your computer and use it in GitHub Desktop.
How meta^n classes work in Ruby 1.9. This requires http://github.com/yugui/evil-ruby/tree/master .
require 'test/unit'
require '/Users/yugui/dev/evil-ruby/lib/evil'
class Object
alias_method :c, :actual_class
end
class Class
alias_method :s, :actual_superclass
end
class Foo; end
class Bar < Foo; end
class TestMetaclass < Test::Unit::TestCase
def assert_equal(expected, obj)
super(expected, obj.inspect)
end
def assert_match(expected, obj)
super(expected, obj.inspect)
end
def test_bar
bar = Bar.new
assert_match /#<Bar:0x[0-9a-f]+>/, bar
assert_equal "Bar", bar.c
assert_equal "#<Class:Bar>", bar.c.c
assert_equal "#<Class:Class>", bar.c.c.c
assert_equal "#<Class:#<Class:Class>>", bar.c.c.c.c
assert_equal "#<Class:#<Class:Class>>", bar.c.c.c.c.c
assert_equal "#<Class:#<Class:Module>>", bar.c.c.c.c.s
assert_equal "#<Class:#<Class:Object>>", bar.c.c.c.c.s.s
assert_equal "#<Class:#<Class:BasicObject>>", bar.c.c.c.c.s.s.s
assert_equal "#<Class:Class>", bar.c.c.c.c.s.s.s.s
assert_equal "#<Class:Module>", bar.c.c.c.c.s.s.s.s.s
assert_equal "#<Class:Object>", bar.c.c.c.c.s.s.s.s.s.s
assert_equal "#<Class:BasicObject>", bar.c.c.c.c.s.s.s.s.s.s.s
assert_equal "Class", bar.c.c.c.c.s.s.s.s.s.s.s.s
assert_equal "Module", bar.c.c.c.c.s.s.s.s.s.s.s.s.s
assert_equal "Object", bar.c.c.c.c.s.s.s.s.s.s.s.s.s.s
#assert_equal "Kernel", bar.c.c.c.c.s.s.s.s.s.s.s.s.s.s.s
#assert_equal "BasicObject", bar.c.c.c.c.s.s.s.s.s.s.s.s.s.s.s.s
assert_equal "false", BasicObject.s
assert_equal "#<Class:Foo>", bar.c.c.s
assert_equal "#<Class:Object>", bar.c.c.s.s
assert_equal "Foo", bar.c.s
assert_equal "Object", bar.c.s.s
#assert_equal "nonsense", bar.s
assert_equal "#<Class:#<Class:Class>>", bar.c.c.c.c.s.c
assert_equal "#<Class:#<Class:Class>>", bar.c.c.c.c.s.s.c
assert_equal "#<Class:#<Class:Class>>", bar.c.c.c.c.s.s.s.c
assert_equal "#<Class:#<Class:Class>>", bar.c.c.c.c.s.s.s.s.c
assert_equal "#<Class:#<Class:Module>>", bar.c.c.c.c.s.s.s.s.s.c # class of #<Class:Module>
assert_equal "#<Class:#<Class:Object>>", bar.c.c.c.c.s.s.s.s.s.s.c # class of #<Class:Object>
assert_equal "#<Class:#<Class:BasicObject>>", bar.c.c.c.c.s.s.s.s.s.s.s.c # class of #<Class:BasicObject>
assert_equal "#<Class:Class>", bar.c.c.c.c.s.s.s.s.s.s.s.s.c # class of Class
assert_equal "#<Class:Module>", bar.c.c.c.c.s.s.s.s.s.s.s.s.s.c # class of Module
assert_equal "#<Class:Object>", bar.c.c.c.c.s.s.s.s.s.s.s.s.s.s.c # class of Object
assert_equal "#<Class:BasicObject>", BasicObject.c
meta = (class << bar; self end)
assert bar.c == meta
assert_match /#<Bar:0x[0-9a-f]+>/, bar
assert_match /#<Class:#<Bar:0x[0-9a-f]+>>/, bar.c
assert_equal "#<Class:Bar>", bar.c.c
assert_equal "#<Class:Class>", bar.c.c.c
end
def test_class
bar = Bar
assert_equal "Bar", bar
assert_equal "#<Class:Bar>", bar.c
assert_equal "Foo", bar.s
meta = (class << Bar; self end)
assert bar.c == meta
assert_equal "#<Class:Bar>", meta
assert_equal "Bar", bar
assert_equal "#<Class:Bar>", bar.c
assert_equal "#<Class:#<Class:Bar>>", bar.c.c
assert_equal "#<Class:#<Class:Class>>", bar.c.c.c
assert_equal "#<Class:#<Class:Class>>", bar.c.c.c.c
assert_equal "#<Class:#<Class:Module>>", bar.c.c.c.s
assert_equal "#<Class:#<Class:Object>>", bar.c.c.c.s.s
assert_equal "#<Class:#<Class:BasicObject>>", bar.c.c.c.s.s.s
assert_equal "#<Class:Class>", bar.c.c.c.s.s.s.s
assert_equal "#<Class:Module>", bar.c.c.c.s.s.s.s.s
assert_equal "#<Class:Object>", bar.c.c.c.s.s.s.s.s.s
assert_equal "#<Class:BasicObject>", bar.c.c.c.s.s.s.s.s.s.s
assert_equal "Class", bar.c.c.c.s.s.s.s.s.s.s.s
assert_equal "Module", bar.c.c.c.s.s.s.s.s.s.s.s.s
assert_equal "Object", bar.c.c.c.s.s.s.s.s.s.s.s.s.s
#assert_equal "Kernel", bar.c.c.c.s.s.s.s.s.s.s.s.s.s.s
#assert_equal "BasicObject", bar.c.c.c.s.s.s.s.s.s.s.s.s.s.s.s
assert_equal "false", BasicObject.s
assert_equal "#<Class:#<Class:Foo>>", bar.c.c.s
assert_equal "#<Class:#<Class:Object>>", bar.c.c.s.s
assert_equal "Foo", bar.s
assert_equal "Object", bar.s.s
assert_equal "#<Class:#<Class:Class>>", bar.c.c.c.s.c # class of #<Class:#<Class:Module>>
assert_equal "#<Class:#<Class:Class>>", bar.c.c.c.s.s.c # class of #<Class:#<Class:Object>>
assert_equal "#<Class:#<Class:Class>>", bar.c.c.c.s.s.s.c # class of #<Class:#<Class:BasicObject>>
assert_equal "#<Class:#<Class:Class>>", bar.c.c.c.s.s.s.s.c # class of #<Class:Class>
assert_equal "#<Class:#<Class:Module>>", bar.c.c.c.s.s.s.s.s.c # class of #<Class:Module>
assert_equal "#<Class:#<Class:Object>>", bar.c.c.c.s.s.s.s.s.s.c # class of #<Class:Object>
assert_equal "#<Class:#<Class:BasicObject>>", bar.c.c.c.s.s.s.s.s.s.s.c # class of #<Class:BasicObject>
assert_equal "#<Class:Class>", bar.c.c.c.s.s.s.s.s.s.s.s.c # class of Class
assert_equal "#<Class:Module>", bar.c.c.c.s.s.s.s.s.s.s.s.s.c # class of Module
assert_equal "#<Class:Object>", bar.c.c.c.s.s.s.s.s.s.s.s.s.s.c # class of Object
assert_equal "#<Class:BasicObject>", BasicObject.c # class of BasicObject
end
def test_metaclass
bar = (class << Bar; self end)
assert_equal "#<Class:Bar>", bar
assert_equal "#<Class:#<Class:Bar>>", bar.c
assert_equal "#<Class:Foo>", bar.s
meta = (class << bar; self end)
assert bar.c == meta
assert_equal "#<Class:#<Class:Bar>>", meta
assert_equal "#<Class:Bar>", bar
assert_equal "#<Class:#<Class:Bar>>", bar.c
assert_equal "#<Class:#<Class:#<Class:Bar>>>", bar.c.c
assert_equal "#<Class:#<Class:#<Class:Class>>>", bar.c.c.c
assert_equal "#<Class:#<Class:#<Class:Class>>>", bar.c.c.c.c
assert_equal "#<Class:#<Class:#<Class:Module>>>", bar.c.c.c.s
assert_equal "#<Class:#<Class:#<Class:Object>>>", bar.c.c.c.s.s
assert_equal "#<Class:#<Class:#<Class:BasicObject>>>", bar.c.c.c.s.s.s
assert_equal "#<Class:#<Class:Class>>", bar.c.c.c.s.s.s.s
assert_equal "#<Class:#<Class:Module>>", bar.c.c.c.s.s.s.s.s
assert_equal "#<Class:#<Class:Object>>", bar.c.c.c.s.s.s.s.s.s
assert_equal "#<Class:#<Class:BasicObject>>", bar.c.c.c.s.s.s.s.s.s.s
assert_equal "#<Class:Class>", bar.c.c.c.s.s.s.s.s.s.s.s
assert_equal "#<Class:Module>", bar.c.c.c.s.s.s.s.s.s.s.s.s
assert_equal "#<Class:Object>", bar.c.c.c.s.s.s.s.s.s.s.s.s.s
assert_equal "#<Class:BasicObject>", bar.c.c.c.s.s.s.s.s.s.s.s.s.s.s
assert_equal "Class", bar.c.c.c.s.s.s.s.s.s.s.s.s.s.s.s
assert_equal "Module", bar.c.c.c.s.s.s.s.s.s.s.s.s.s.s.s.s
assert_equal "Object", bar.c.c.c.s.s.s.s.s.s.s.s.s.s.s.s.s.s
#assert_equal "Kernel", bar.c.c.c.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s
#assert_equal "BasicObject", bar.c.c.c.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s
assert_equal "false", BasicObject.s
assert_equal "#<Class:#<Class:#<Class:Foo>>>", bar.c.c.s
assert_equal "#<Class:#<Class:#<Class:Object>>>", bar.c.c.s.s
assert_equal "#<Class:#<Class:Foo>>", bar.c.s
assert_equal "#<Class:#<Class:Object>>", bar.c.s.s
assert_equal "#<Class:Foo>", bar.s
assert_equal "#<Class:Object>", bar.s.s
assert_equal "#<Class:#<Class:#<Class:Class>>>", bar.c.c.c.s.c # class of #<Class:#<Class:#<Class:Module>>>"
assert_equal "#<Class:#<Class:#<Class:Class>>>", bar.c.c.c.s.s.c # class of "#<Class:#<Class:#<Class:Object>>>"
assert_equal "#<Class:#<Class:#<Class:Class>>>", bar.c.c.c.s.s.s.c # class of "#<Class:#<Class:#<Class:BasicObject>>>"
assert_equal "#<Class:#<Class:#<Class:Class>>>", bar.c.c.c.s.s.s.s.c # class of "#<Class:#<Class:Class>>"
assert_equal "#<Class:#<Class:#<Class:Module>>>", bar.c.c.c.s.s.s.s.s.c # class of "#<Class:#<Class:Module>>"
assert_equal "#<Class:#<Class:#<Class:Object>>>", bar.c.c.c.s.s.s.s.s.s.c # class of "#<Class:#<Class:Object>>"
assert_equal "#<Class:#<Class:#<Class:BasicObject>>>", bar.c.c.c.s.s.s.s.s.s.s.c # class of "#<Class:#<Class:BasicObject>>"
assert_equal "#<Class:#<Class:Class>>", bar.c.c.c.s.s.s.s.s.s.s.s.c # class of "#<Class:Class>"
assert_equal "#<Class:#<Class:Module>>", bar.c.c.c.s.s.s.s.s.s.s.s.s.c # class of "#<Class:Module>"
assert_equal "#<Class:#<Class:Object>>", bar.c.c.c.s.s.s.s.s.s.s.s.s.s.c # class of "#<Class:Object>"
assert_equal "#<Class:#<Class:BasicObject>>", bar.c.c.c.s.s.s.s.s.s.s.s.s.s.s.c # class of "#<Class:BasicObject>"
assert_equal "#<Class:Class>", bar.c.c.c.s.s.s.s.s.s.s.s.s.s.s.s.c # class of "Class"
assert_equal "#<Class:Module>", bar.c.c.c.s.s.s.s.s.s.s.s.s.s.s.s.s.c # class of "Module"
assert_equal "#<Class:Object>", bar.c.c.c.s.s.s.s.s.s.s.s.s.s.s.s.s.s.c # class of "Object"
assert_equal "#<Class:BasicObject>", BasicObject.c # class of BasicObject
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment