Created
December 9, 2008 16:47
-
-
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 .
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
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