【问题标题】:Why Object.class == Class in Ruby?为什么 Object.class == Ruby 中的类?
【发布时间】:2009-08-02 19:59:25
【问题描述】:

我认为 Object 是每个人的祖先,包括 Class。 所以我认为应该是 Class.class== Object。 我感到有些困惑和扭曲

【问题讨论】:

    标签: ruby oop


    【解决方案1】:

    class 返回类(#type)而不是祖先。对象的类是类。类的类是类。类是一个对象。广告中的真相:我从未学过 Ruby,但 Object-Class 关系必须是 Smalltalk 30 年前提出的。

    【讨论】:

    • 元类在 Ruby 中的工作方式不同:它们被注入到方法查找链中,因此 Ruby 没有类和元类的两个并行层次结构,但是,正如您所说,基础是相同的。
    • @Jorg:谢谢。一旦我完成了我目前的项目,我就会开始学习 Rails 和 Ruby,我听到了很多赞美,我很感兴趣 :)
    • 谢谢。我想我现在很清楚这些关系。 @Jörg_W_Mittag 的信息也有帮助。也就是说,类和元类是两个不同但相关的概念。
    • 是的,但是这个解释并没有真正详细说明类 Class 的用途以及为什么要向它扩展方法,大概是所有类都可以有类方法,而不是只是实例并继承自的对象对象类。
    【解决方案2】:

    Class、Object、Module 和所有其他类都是 class 类的instances :)

    Class.class== Module.class== Object.class== Hash.class== 类

    类也是一个对象(与系统中的任何其他对象一样),但它不是对象的直接实例,它是派生类的实例(本例中的类)

    Class.superclass.superclass== 对象(中间有模块)

    对象本身也是一个类。所以 Object.class== 类

    类、模块和对象具有循环依赖关系,因为它们是 OO 模型的核心。

    Object.class.superclass.superclass== 对象

    => parent (.superclass)
    -> instance-of (.class)
    

    alt text http://www.grabup.com/uploads/b10b2ffa9976953e3d6f88e6fcbf6f28.png?direct

    【讨论】:

    • 循环依赖有效,因为这些都是内置类。它们是核心 Ruby 运行时的一部分,并在启动时以这种方式设置,并且不会像通常添加类的方式那样添加。运行时有能力随心所欲地设置指针,设计者选择这样做。
    【解决方案3】:

    Object的类是Class(因为Object本身就是一个类),而ObjectClass的祖先。

    有一个循环引用,它非常复杂。我个人的建议,如果你真的不需要玩的话,不要去那里。

    【讨论】:

      【解决方案4】:

      这是它在 ruby​​ 1.9 中的工作方式:

      Class.class = Class
      
      Class.superclass = Module
      Module.class = class
      Module.superclass = Object
      Object.class = Class
      Object.superclass = BasicObject
      BasicObject.class = Class
      BasicObject.superclass = nil
      

      【讨论】:

        猜你喜欢
        • 2017-10-08
        • 2013-12-10
        • 1970-01-01
        • 2020-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-12
        • 2010-09-14
        相关资源
        最近更新 更多