本文记录在《ruby 元编程》这本书中学到的一些知识点。
对象模型
class 关键字
这个关键字更象是一个作用域操作符而不是类型声明语句,它的核心任务是将代码带到类的上下文中,可以从这个角度理解 open class
模块的实现
以下面的代码为例
| 1
2
3
4
5
6
7
 | module X;end
class   A
    include X
end
class  B < A; end
 | 
实际情况下,ruby 将生成一个匿名类来封装模块 X ,在最终的继承链上,这个匿名类将在包含 X 的类 A 之上,这样,类 B 的继承链就是
| 1
 | B < A < X(shadow) < Object < Kernel(shadow) < BasicObject
 | 
* 以上细节在 superclass 这个 api 上反映不出来,不过每个类可以调用自己的 ancestors 方法看到细节
| 1
2
 |  1.9.3p194 :001 > String.ancestors
  => [String, Comparable, Object, Kernel, BasicObject]
 | 
* 多个 include 的情况
| 1
2
3
4
5
6
7
8
9
10
11
12
 | module X;end
module Y;end
class   A
    include X
    include Y
end
class  B < A; end
B.ancestors
 => [B, A, Y, X, Object, Kernel, BasicObject]
 |