[RubyHackingGuide]对象的基础RBasic

比较大部分的对象类, 我们会发现它们都包含一个共同点: RBasic.
[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~)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值