【问题标题】:Ruby: "Class is an object and Object is a class" [duplicate]Ruby:“类是一个对象,对象是一个类”[重复]
【发布时间】:2016-07-03 04:40:26
【问题描述】:

从表面上看,这是有道理的:

(Class.is_a? Object) && (Object.is_a? Class)

计算为true

但是,它似乎引入了循环依赖:ClassObject 的子类,这意味着必须先定义Object,然后才能定义Class。但是,ObjectClass 的一个实例,这意味着必须先定义Class,然后才能定义Object

这怎么可能?

这可能与询问Class如何是Class的实例有关:

(Class.instance_of? Class)

返回true

【问题讨论】:

    标签: ruby


    【解决方案1】:

    这是在 Ruby MRI 中实现的答案:

    Init_class_hierarchy(void)
    {
        rb_cBasicObject = boot_defclass("BasicObject", 0);
        rb_cObject = boot_defclass("Object", rb_cBasicObject);
        rb_cModule = boot_defclass("Module", rb_cObject);
        rb_cClass =  boot_defclass("Class",  rb_cModule);
    
        rb_const_set(rb_cObject, rb_intern_const("BasicObject"), rb_cBasicObject);
        RBASIC_SET_CLASS(rb_cClass, rb_cClass);
        RBASIC_SET_CLASS(rb_cModule, rb_cClass);
        RBASIC_SET_CLASS(rb_cObject, rb_cClass);
        RBASIC_SET_CLASS(rb_cBasicObject, rb_cClass);
    }
    

    Object 首先使用boot_defclass 创建为BasicObject 的后代。之后,使用RBASIC_SET_CLASS 将其类设置为Class

    您的推理中的失误在这里:“ObjectClass 的一个实例,这意味着必须先定义Class,然后才能定义Object。”在 Object 的类都创建后,没有什么可以阻止您将它们设置为 Class

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 2013-04-01
      • 2011-06-11
      • 2023-01-13
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      • 2012-08-14
      • 1970-01-01
      相关资源
      最近更新 更多