Что первично в объектной модели Ruby? - PullRequest
5 голосов
/ 18 мая 2010

Я читал Метапрограммирование Ruby, и объектная модель похожа на дилемму курица или яйцо.

В Ruby 1.8 класс Object является экземпляром Class. Суперкласс модуля является Object и является экземпляром Class. Суперклассом Class является Module, и он является экземпляром Class (самоссылочный). Скажем класс SomeClass; конец определен где-то; SomeClass является экземпляром Class, однако его суперклассом является Object. Почему экземпляр Class имеет Object в качестве суперкласса вместо nil?

Кроме того, если Объект должен существовать, тогда Класс должен существовать, но тогда Модуль должен существовать, но для Существующего Модуля Объект должен существовать. Как создаются эти классы?

Ответы [ 3 ]

5 голосов
/ 19 мая 2010

Вот полная диаграмма классов Ruby (для Ruby 1.8): http://banisterfiend.wordpress.com/2008/11/25/a-complete-ruby-class-diagram/

Чтобы помочь вам понять странную, казалось бы, невозможную саморефлексивную природу диаграммы классов, полезно знать, что указатели класса и указатели суперкласса могут быть назначены в любое время в C API. То есть вы можете создать объект (в C API) и после этого решить, на что указывают указатели классов и классов.

Кроме того, чтобы понять порядок определения, посмотрите на Init_Object() в object.c (в 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 - это BasicObject в Ruby, rb_cObject - это Object в Ruby и т. Д.

1 голос
/ 24 мая 2010

Более подробную информацию вы можете найти в Руководстве по взлому Ruby: http://rhg.rubyforge.org/

Особенно глава 04: Бутстрап

1 голос
/ 18 мая 2010

Самое простое, что нужно учесть, это то, что все в рубине - это Объект. Все остальное является модификацией этой концепции. Таким образом, класс Class добавляет класс как функциональность, изменяя Object. В результате каждый объект является классом и т. Д.

Суперклассом Object является ноль. ( Ссылки )

Суперклассом Object является BasicObject (в 1.9), а суперклассом BasicObject является nil.

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