【问题标题】:What comes first in Ruby's object model?Ruby 的对象模型中最先出现的是什么?
【发布时间】:2011-02-21 01:03:09
【问题描述】:

我一直在阅读 Metaprogramming Ruby,对象模型就像是先有鸡还是先有蛋的困境。

在 Ruby 1.8 中,Object 类是 Class 的一个实例。 Module的超类是Object,是Class的一个实例。 Class 的超类是 Module,它是 Class 的一个实例(自引用)。说类 SomeClass; end 在某处定义; SomeClass 是 Class 的一个实例,但它的超类是 Object。为什么 Class 的实例有 Object 作为超类而不是 nil?

另外,如果 Object 要存在,那么 Class 必须存在,但 Module 必须存在,但 Module 要存在 Object 必须存在。这些类是如何创建的?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    您可以在 Ruby 黑客指南中找到更多详细信息:http://rhg.rubyforge.org/

    特别是第04章:引导

    【讨论】:

      【解决方案2】:

      这是一个完整的 Ruby 类图(适用于 Ruby 1.8):http://banisterfiend.wordpress.com/2008/11/25/a-complete-ruby-class-diagram/

      为了帮助您理解类图奇怪的看似不可能的自反性质,了解在 C API 中可以随时分配类指针和超类指针是很有用的。也就是说,您可以创建一个对象(在 C API 中)并在事后决定 Class 和 Super 类指针指向什么。

      另外,要了解定义的顺序,请查看object.c 中的Init_Object()(在Ruby 1.9 中)

      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);
      
      metaclass = rb_make_metaclass(rb_cBasicObject, rb_cClass);
      metaclass = rb_make_metaclass(rb_cObject, metaclass);
      metaclass = rb_make_metaclass(rb_cModule, metaclass);
      metaclass = rb_make_metaclass(rb_cClass, metaclass);
      boot_defmetametaclass(rb_cModule, metaclass);
      boot_defmetametaclass(rb_cObject, metaclass);
      boot_defmetametaclass(rb_cBasicObject, metaclass);
      

      rb_cBasicObject 在 Ruby 中是 BasicObjectrb_cObject 在 Ruby 中是 Object,依此类推。

      【讨论】:

        【解决方案3】:

        要考虑的最简单的事情是 ruby​​ 中的一切都是对象。其他一切都是对这个概念的修改。所以类 Class 通过修改 Object 来增加类的功能。因此,每个 Object 都是一个类,等等。

        Object 的超类是 nil。 (Reference)

        Object 的超类是 BasicObject(在 1.9 中),BasicObject 的超类是 nil。

        【讨论】:

        • 好的,所以首先创建 Object(在 1.8 中),然后再修改,以便 Object#class 是 Class?
        猜你喜欢
        • 1970-01-01
        • 2012-01-09
        • 2010-12-02
        • 2022-01-25
        • 2015-10-15
        • 1970-01-01
        • 2017-06-14
        • 2015-06-08
        • 1970-01-01
        相关资源
        最近更新 更多