winteen 发表于 2013-2-4 20:06:50

[RubyHackingGuide]对象的基础RBasic

比较大部分的对象类, 我们会发现它们都包含一个共同点: RBasic.
http://www.agoit.com/upload/attachment/125726/4855a7b3-3a5b-3cb8-87b1-fee6196bce42.png
    RBasic的定义是:
   struct RBasic {      unsigned long flags;      VALUE klass;   };

    flags的结构如下:
http://www.agoit.com/upload/attachment/125730/d59da9a2-2abc-38f5-8e33-91cd1e89ef3d.png
ruby中有一套FL_XXX宏来专门处理这个记录了对象在C层面的类型信息的标记.

    klass这个指针指向一个类对象.对一个String的实例来说, 见下图:
http://www.agoit.com/upload/attachment/125736/7637ce18-6561-3e9b-8e93-1be6700b5347.png
    大家应该能猜到, Ruby对象在响应消息时, 是通过klass来进行的.
    String这个Ruby层面上的类对象, 对应于C层面上一个RClass类型的变量.关于如何在C层面定义这样一个变量, 参见RClass.

    那么, 既然已经对象类的结构中已经存储了类对象(klass), 那么为什么还要在flags中存储对象类的结构信息呢? 我们很显然可以通过类对象反推出对象类的类型信息.ruby不这么做, 有两个原因: 不是所有的对象类都包含RBasic!例如RNode, 但它的第一个成员是flags, 这样ruby就可以统一处理对象类的类型信息了.(似乎只有一个原因诶.而且RNode是什么呢?Take it easy~)
页: [1]
查看完整版本: [RubyHackingGuide]对象的基础RBasic