在“rubymonk”和其他一些 ruby 资源中,提到当您在对象上定义单例方法时,Ruby 正在将这个新方法添加到对象的元类中。对?还有一个访问元类的技巧,就是这样:
class Object
def metaclass
class << self
self
end
end
end
foo = "I'm a string object"
def foo.shout
puts self.upcase
end
foo.shout
p foo.metaclass.class
p foo.class.instance_methods.include? :shout
p foo.metaclass.instance_methods.include? :shout
正如我们所料,结果是:
I'M A STRING OBJECT
Class
false
true
一切都很好。但是如果我们将元类方法更改为 returnHash
而不是self
呢?
class Object
def metaclass
class << self
Hash
end
end
end
然后我们检查这些事情:
p foo.class.instance_methods.include? :shout
p foo.metaclass.instance_methods.include? :shout
p String.instance_methods.include? :shout
p Object.instance_methods.include? :shout
p Hash.instance_methods.include? :shout
是的,所有这些都是错误的:
false
false
false
false
false
问题是,shout
方法现在属于什么?它不是元类。那是什么?!