【问题标题】:Ruby class/object/module diagram explanationRuby类/对象/模块图解释
【发布时间】:2014-12-02 22:40:32
【问题描述】:

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 的实例。”那是唯一一个东西是实例并继承自的地方吗?

【问题讨论】:

  • 糟糕。修复了链接。

标签: ruby oop


【解决方案1】:

什么是 obj?

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

obj = OtherClass.new

什么是其他类?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2011-06-22
    • 1970-01-01
    相关资源
    最近更新 更多