fsword's blog

A blogging framework for hackers.

Ruby元编程读书笔记

| Comments

本文记录在《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]

Comments