uby meta-class 分析
ruby core 文档对class , object 和 meta-class 的描述如下:
Classes, modules, and objects are interrelated. In the diagram that follows, the vertical arrows represent inheritance, and the parentheses meta-classes. All metaclasses are instances of the class `Class’.
第一次看起来有点糊涂,让我们仔细的来分析一下。先说上面这个图吧
垂直箭头表示继承关系,括号中的(someclass)就是meta-classes,所有的meta-classes都是类Class的实例。
meta-classes是什么?
简单从一个例子说起吧
如果我们建立了一个Person类
irb(main):001:0> class Person
irb(main):002:1> end
=> nil
irb(main):003:0>
当ruby解释器执行上面代码,结束返回nil后,这时候我们就有了一个meta-class,叫Person,它是Class的一个实例
测试一下:
irb(main):003:0> Person.class
=> Class
看来它是Class类的一个实例,从图上看它的祖先是Object那么它也应该有Object类的方法 instance_of?(class)
测试一下:
irb(main):004:0> Person.instance_of?(Class)
=> true
哦,他果然是Class的实例。
再来看看meta-class (Object, Module, Class)
irb(main):005:0> Class.class
=> Class
irb(main):006:0> Module.class
=> Class
irb(main):007:0> Object.class
=> Class
irb(main):008:0>
可见ruby解释器加载时,就自动加载了Object类,Module类,Class类,所以己经生成了他们的meta-class