[关闭]
@elibinary 2017-05-21T03:44:15.000000Z 字数 969 阅读 827

[读书笔记] Ruby 类与对象 - 结构

Ruby


每个 Ruby 对象都是类指针和实例变量数组的组合

Object

首先先来深入 Ruby 对象内部,来看看其内部结构到底是怎么构成的。
Ruby 把每个自定义对象都保存在名为 RObject 的由 c 语言实现的结构体中。

说起 c 语言的结构体,首先就令我想起了念书时曾做过的“如何使用 c 去模拟实现面向对象的继承与多态”
一个简单的小例子:

  1. struct Base
  2. {
  3. char *name = "base";
  4. int age;
  5. void (*fire)(const void *self);
  6. };
  7. struct Biont
  8. {
  9. const struct Base base;
  10. int bb;
  11. };
  12. struct Human
  13. {
  14. const struct Base base;
  15. int race;
  16. };

fire 的实现

  1. void fire(const void *self)
  2. {
  3. const struct Base *cp = self;
  4. (*cp) -> fire(self);
  5. }

C语言能够模拟实现面向对象语言具有的特性,包括:多态,继承,封装等,现在很多开源软件都了用C语言实现了这几个特性。

让我们把目光重新转到 Ruby 的 Object 结构上,这个 RObject 的结构体到底长啥样呢

RObject

我第一眼看到就觉得莫名的熟悉感。
可以看出其实在 RObject 结构中还内嵌了一个 RBasic 结构体,RBasic 结构体中包含了所有值都会用到的信息,一组叫作 flags 的布尔值,用来存储各种内部专用的值,还有一个叫 klass 的类指针,用来指向所属类。

  1. class MyClass
  2. attr_accessor :inc_attr_one
  3. attr_accessor :inc_attr_two
  4. end
  5. obj_1 = MyClass.new
  6. obj_1.inc_attr_one = 'one'
  7. obj_1.inc_attr_two = 'two'
  8. obj_2 = MyClass.new
  9. obj_2.inc_attr_two = 'touch'

RObjet-2

关于基础类型对象

Ruby 中一切皆对象

Ruby 中基本的数据类型也是对象。在 Ruby 中,并不使用上面所说的 RObject 结构体来存储基础类型对象。它为这些基础类型设计了特有的结构

base-object

RObject 只用来存储自定义类的实例对象以及一些 Ruby 内部创建的少数自定义类的实例对象。不过你可能一经发现了,这些不同结构的对象存储形式中都包含了 RBasic 结构体。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注