Ruby类/对象/模块图说明

时间:2014-12-02 22:40:33

标签: ruby oop

http://www.ruby-doc.org/core-2.1.5/Class.html "类,模块和对象是相互关联的。在下图中,垂直箭头表示继承,括号元类。所有元类都是类Class的实例。"

                     +---------+             +-...
                     |         |             |
     BasicObject-----|-->(BasicObject)-------|-...
         ^           |         ^             |
         |           |         |             |
      Object---------|----->(Object)---------|-...
         ^           |         ^             |
         |           |         |             |
         +-------+   |         +--------+    |
         |       |   |         |        |    |
         |    Module-|---------|--->(Module)-|-...
         |       ^   |         |        ^    |
         |       |   |         |        |    |
         |     Class-|---------|---->(Class)-|-...
         |       ^   |         |        ^    |
         |       +---+         |        +----+
         |                     |
obj--->OtherClass---------->(OtherClass)-----------...

什么是obj?什么是OtherClass?什么是水平箭头?什么可以在......的另一边?

"所有元类都是Class的实例。"这是唯一一个东西是实例并且还从中继承的地方吗?

1 个答案:

答案 0 :(得分:3)

什么是obj?

objOtherClass的一个实例。你可以通过调用

来获得它
obj = OtherClass.new

什么是OtherClass?

OtherClass是不在ClassModuleObjectBasicObject集合中的任何类。您可以通过编写

创建一个这样的类
class OtherClass
end

虽然StringArray等核心库类也适用于此。

什么是横向箭头?

除了从objOtherClass的箭头外,每个水平箭头代表调用.singleton_class的行为,它会返回一次性Class对象,也称为元类

“......”的另一面可能是什么?

如果您注意到,图表右半部分的整个结构是通过调用.singleton_class从图表的左半部分提取元类得出的。最右边的“...”表示同一模式的递归延续,即在元类本身上调用.singleton_class,然后在元类的元类上调用.singleton_class,依此类推。

所有元类都是Class的实例。元类是继承它的实例的唯一例子吗?

所有类都是Class的实例同样如此。根据定义,任何类的任何实例都是它继承的实例。

奇怪的是,BasicObject的元类是唯一的,因为没有其他对象的类和超类是相同的。其他一些有趣的自引用对象包括:

1)Object类对象

Object.is_a?(Object)
# => true

Object.class.superclass.superclass
# => Object

2)Class类对象

Class.is_a?(Class)
# => true

Class.class
# => Class

3)Module类对象

Module.is_a?(Module)
# => true

Module.class.superclass
# => Module

4)BasicObject类对象

BasicObject.is_a?(BasicObject)
# => true

BasicObject.class.superclass.superclass.superclass
# => BasicObject