BasicObject,Object和Kernel如何相互交互?

时间:2013-02-23 09:03:23

标签: ruby

为了理解BasicObject, Object, and Kernel如何相互影响,我想到了以下代码,这些代码可以从David A Black的书的页面#100 中找到:

class BasicObject
# a scant seven method definitions go here
end
module Kernel
# over 100 method definitions go here!
end
class Object < BasicObject
# one or two private methods go here,
# but the main point is to mix in the Kernel module
include Kernel
end

Object是BasicObject的子类。每个没有明确超级的班级 class是Object的子类。您可以在irb中看到此默认值的证据:

class C
end
#=>nil
C.superclass
#=>Object

好的,但是David Black的下面 BOLD 行在他的书中让我很难理解:

“每个类都有对象 - 因此内核和BasicObject - 它的祖先.ofcourse, 仍然存在BasicObjectObject的悖论,并且ObjectClass,而ClassObject。但正如您之前看到的,类模型中的一些循环用于启动层次结构;以及一旦开始运作,它就会在逻辑上干净利落地运作。“

以下是我的问题:

  1. 他为什么把这种关系称为 paradox BasicObjectObjectObjectClassClassObject
  2. 他在这里试图说什么是circularity

1 个答案:

答案 0 :(得分:3)

你混淆了“是”的两个含义:“实例”和“子类”。

1)关于子类关系:

  • ClassModule
  • 的子类
  • ModuleObject
  • 的子类
  • ObjectBasicObject
  • 的子类

由于传递性,ClassObjectBasicObject的子类,ModuleBasicObject的子类。但这里没有循环。例如,BasicObject不是ClassModuleObject的子类。

2)关于实例化关系:

  • ClassClass的实例(以及[种类] ModuleObjectBasicObject)。
  • ModuleClass的实例(以及[种类] ModuleObjectBasicObject)。
  • ObjectClass的实例(以及[种类] ModuleObjectBasicObject)。
  • BasicObjectClass的实例(以及[种类] ModuleObjectBasicObject)。

但实例化关系中没有循环性。循环性是关于传递关系的概念。例如,如果A → BB → C,则A → C由于传递性而遵循,如果它也是C → A,则存在循环性。但是实例化关系不是传递性的。 “A是B的实例”,“B是C的实例”并不意味着“A是C的实例”。因此,不能以非平凡的方式在实例化关系中定义循环性。