类/对象悖论混淆

在书中The Well Grounded Rubyist( 摘录 )中,David Black谈到了“Class / Object Chicken-and-Egg Paradox”。 我很难理解整个概念。

有人可以用更好/更容易/类比/其他术语解释它吗?

引用(强调我的):

Class是它自己的一个实例; 也就是说,它是一个Class对象。 而且还有更多。 还记得class级Object吗? 好吧, Object是一个类……但是类是对象。 所以, Object是一个对象。 Class是一个class级。 Object是一个类, Class是一个对象。

哪个先来? 除非类Object已存在,否则如何创建类Class ? 但是,如果有一个类Class可以有实例,那么怎么会有一个类Object (或任何其他类)呢?

至少就目前而言,解决这一悖论的最佳方法是忽略它。 为了让类和对象系统运行起来,Ruby必须做一些鸡蛋或鸡蛋的东西 – 然后,循环和悖论并不重要。 在编程过程中,您只需要知道类是对象,类的实例称为Class

(如果你想简要地知道它是如何工作的,就像这样:每个对象都有一个内部记录,它是一个实例的类,而对象Class里面的内部记录指向Class 。)

您可以在此图中看到问题:

Ruby方法查找流程http://sofzh.miximages.com/ruby/RubyMethodLookupFlow.png

所有对象实例都从Objectinheritance。 所有类都是对象, Class是一个类,因此Class是一个对象。 但是,对象实例从其类inheritance,而ObjectClass类的实例,因此Object本身从Class获取方法。

然而,正如您在图中所看到的,没有循环查找循环,因为每个类有两个不同的inheritance“部分”:实例方法和“类”方法。 最后,查找路径是理智的。

注意:此图反映了Ruby 1.8,因此不包含Ruby 1.9中引入的核心BasicObject类。

实际上,您需要了解的是Object是所有类的母亲。 所有类都扩展了Object 。 您将在编程,理解inheritance等中使用这种关系。

例如; 你可以随时在任何对象的任何实例上调用hash()吗? 为什么? 因为该函数出现在Object类中,并且所有类都inheritance该函数,因为所有类都扩展了Object

Class的想法而言,这种情况的发生频率要低得多。 类Class的对象就像一个蓝图,就像把手放在你的手中,而不是创建它的实例。 还有一点,但没有一个冗长的例子,这是一个很难描述。 请放心,当(如果有的话)使用它的时候,你会看到它的目的。

所有这些摘录都说是Object有一个Class类,Class是一个对象,所以必须扩展Object 。 它是循环的,但它无关紧要。 答案隐藏在编译器的某个地方。

关于哪个来自第一个标准,有两种Ruby对象:

  • 内置物体。 它们存在于Ruby程序的开头,可以认为没有创建时间。
  • 用户创建的对象。 它们是在程序启动后通过对象创建方法(new / clone / dup,class-definition,module-definition,literal-constructs,…)创建的。 这些对象按其创建时间线性排序。 这个顺序恰好与类inheritance和关系实例相对应。

有关Ruby对象模型的详细说明,请访问www.atalon.cz 。

我知道我的答案至少延迟了3年,但我最近才了解Ruby,我必须承认文献有时会出现(在我看来)误导性的解释,即使是处理一个非常简单的问题。 而且,我(并且)对这样令人震惊的短语感到惊讶:

  "The best way to deal with this paradox, at least for now, is to ignore it." 

作者D.布莱克说,并在问题中引用,但这种态度似乎是普遍存在的。 我在物理学界经历过这种趋势,但我并不怀疑它也通过编程传播。 我并没有说明没有人理解潜藏的是什么,但似乎至少有趣的是为什么不提供(确实)非常简单和精确的答案,因为在这种情况下有一个,而没有引用任何模糊的词,如“悖论”说明。

这种所谓的“悖论”(即使它绝对不是这样的东西)来自(至少是误导性的)信念,即“作为(子类)的实例”应该是“作为”的一个元素(在比方说,天真集理论,或者换句话说,一个类(在Ruby中)是包含共享一些公共属性的所有对象的集合(例如,在这种天真的解释下,类String包括所有的字符串对象)。 即使这种天真的观点(我可以称之为“成员解释”)可能有助于理解孤立的(而且相当容易的)类,如字符串或符号,但它确实产生了一种清晰的矛盾与我们天真的理解(以及公理化的一种)因为它与冯诺依曼的集合论的规律性公理相矛盾,如果有人知道我所说的是成员关系,那么对象就不能成为自身的一个元素,正如前面的解释所暗示的那样,当关于对象类时。

如果用如下非常简单的模型摆脱这种误导性的成员解释,则容易避免前面提到的问题。 我猜我的下面的解释是专家所熟知的,所以我声称没有任何原创性,但也许它没有用(简单)术语来改写我将要呈现它:在某种意义上我完全惊讶(显然)从一开始就没有人用这些术语说明,我的目的只是强调我认为的基本底层结构。

让我们考虑一组O(基本)对象,它包含Ruby所拥有的所有(基本)对象,提供从O到O的映射f(或多或少是.class方法),满足图像的f本身的组成只有一个元素。 后一个元素(或对象)表示为Class(实际上,您知道的是类Class)。 我很想用LaTeX代码写这篇文章,但我不太确定它是否会被解析并转换成典型的数学表达式。 映射f的图像(根据定义)是Ruby类的集合(例如String,Object,Symbol,Class等)。 Ruby程序员(即使他们不知道)解释前面的结构如下:当且仅当y = f(x)时,我们说对象“x是y的实例”。 顺便说一下,这告诉我们你究竟是Class的一个实例(即它本身)。

现在,我们需要更多装饰到这个简单的模型,以获得类和function的完整Ruby层次结构(强制在地图f的图像上存在一些固定成员,在地图f的图像上存在偏序)为了定义子类以获得后续inheritance等,特别是为了得到有趣的upvoted的漂亮图片,但我想每个人都可以从我给出的原始模型中解决这个问题(我已经写了一些页面来解释这个在阅读了几本Ruby手册之后,我可以提供一份副本,如果有人发现它有用的话。

首先是: 类Class还是类Object

每个类都是类Class的一个实例。 接下来, 类Object类Class的一个实例。 所以你需要类Class来创建类Object 。 因此:

  1. 类Class 存在于 Object 之前

类ClassObject 的子 。 因此,您需要可以从中创建类Class类Object 。 因此:

  1. 类Object 存在类Class 之前

所以声明-2与声明-1冲突,所以我们有鸡与蛋的困境。 或者你可以接受它作为循环定义!