比较大部分的对象类, 我们会发现它们都包含一个共同点: RBasic.
[img]/upload/attachment/125726/4855a7b3-3a5b-3cb8-87b1-fee6196bce42.png[/img]
RBasic的定义是:
flags的结构如下:
[img]/upload/attachment/125730/d59da9a2-2abc-38f5-8e33-91cd1e89ef3d.png[/img]
ruby中有一套FL_XXX宏来专门处理这个记录了对象在C层面的类型信息的标记.
klass这个指针指向一个类对象.对一个String的实例来说, 见下图:
[img]/upload/attachment/125736/7637ce18-6561-3e9b-8e93-1be6700b5347.png[/img]
大家应该能猜到, Ruby对象在响应消息时, 是通过klass来进行的.
String这个Ruby层面上的类对象, 对应于C层面上一个RClass类型的变量.关于如何在C层面定义这样一个变量, 参见[url]RClass[/url].
那么, 既然已经对象类的结构中已经存储了类对象(klass), 那么为什么还要在flags中存储对象类的结构信息呢? 我们很显然可以通过类对象反推出对象类的类型信息.ruby不这么做, 有两个原因: 不是所有的对象类都包含RBasic!例如RNode, 但它的第一个成员是flags, 这样ruby就可以统一处理对象类的类型信息了.(似乎只有一个原因诶.而且RNode是什么呢?Take it easy~)
[img]/upload/attachment/125726/4855a7b3-3a5b-3cb8-87b1-fee6196bce42.png[/img]
RBasic的定义是:
struct RBasic {
unsigned long flags;
VALUE klass;
};
flags的结构如下:
[img]/upload/attachment/125730/d59da9a2-2abc-38f5-8e33-91cd1e89ef3d.png[/img]
ruby中有一套FL_XXX宏来专门处理这个记录了对象在C层面的类型信息的标记.
klass这个指针指向一个类对象.对一个String的实例来说, 见下图:
[img]/upload/attachment/125736/7637ce18-6561-3e9b-8e93-1be6700b5347.png[/img]
大家应该能猜到, Ruby对象在响应消息时, 是通过klass来进行的.
String这个Ruby层面上的类对象, 对应于C层面上一个RClass类型的变量.关于如何在C层面定义这样一个变量, 参见[url]RClass[/url].
那么, 既然已经对象类的结构中已经存储了类对象(klass), 那么为什么还要在flags中存储对象类的结构信息呢? 我们很显然可以通过类对象反推出对象类的类型信息.ruby不这么做, 有两个原因: 不是所有的对象类都包含RBasic!例如RNode, 但它的第一个成员是flags, 这样ruby就可以统一处理对象类的类型信息了.(似乎只有一个原因诶.而且RNode是什么呢?Take it easy~)