Как мы говорим о классах, которые не наследуются от класса `Class` в Ruby? - PullRequest
4 голосов
/ 26 июня 2019

BasicObject , насколько я читал, является родительским классом всех других классов в Ruby. Однако только в иерархии ниже определяется класс Class. Поэтому мне трудно понять, как BasicObject может быть классом вообще.

Разница здесь только в том, что есть разница между рубином Class в абстрактном, объектно-ориентированном смысле, в отличие от классов, которые на самом деле являются экземплярами Class? Или иерархия фактически настроена таким образом, что BasicObject фактически является экземпляром Class? Я уверен, что это не так.

Если в Ruby есть два значения слова "класс", я чувствую, что мне не хватает языка для обсуждения этих двух типов. Если это действительно так, что я могу назвать классом, который не является экземпляром Class?

Ответы [ 2 ]

2 голосов
/ 26 июня 2019

Как бы это ни было сногсшибательно, это действительно так. BasicObject - это Class, а Class - это BasicObject.

Я не думаю, что это можно выразить в ruby, поэтому для выполнения этой работы MRI непосредственно создает внутренние структуры для этих нескольких фундаментальных классов и связывает их таким циклическим образом .

void
Init_class_hierarchy(void)
{
    rb_cBasicObject = boot_defclass("BasicObject", 0);
    rb_cObject = boot_defclass("Object", rb_cBasicObject);
    rb_gc_register_mark_object(rb_cObject);

    /* resolve class name ASAP for order-independence */
    rb_set_class_path_string(rb_cObject, rb_cObject, rb_fstring_lit("Object"));

    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);
}

Как мы видим, не существует двух типов классов: пользовательского и "глубокого". Это та же сущность.

2 голосов
/ 26 июня 2019

Вы можете рассматривать все классы, являющиеся экземплярами Class в мире Ruby.Стоит помнить, что все в ruby ​​- это объект, включая классы.Да BasicObject является верхним родительским классом всех классов в Ruby.Класс BasicObject, являющийся Class, не совпадает с родительским классом BasicObject, равным Class.

. Для демонстрации предположим, что у нас определен класс Person.

  • Person.new.class равно Person
  • Person.class равно Class
  • Person.superclass равно Object
  • Object.class равноClass
  • Object.superclass равно BasicObject
  • BasicObject.class равно Class
  • BasicObject.superclass равно nil

Доказательства всех классов в Ruby на самом деле являются объектами, вы можете получить идентификатор объекта класса.BasicObject.object_id.В общем объектно-ориентированном контексте класс класса не должен иметь смысла, если только классы не являются объектами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...