2009-08-02 3 views
5

Я думаю, что Объект - предки всех, включая класс. Так что я думаю, что это должен быть Class.class == Object. Я чувствую себя немного запутанным и искаженнымПочему Object.class == Класс в Ruby?

ответ

10

класс возвращает класс (#type) не предок. Класс объектов - класс. Класс класса - класс. Класс - это объект. Правда в рекламе: я никогда не узнавал Ruby, но отношение Object-Class имеет, чтобы быть одним Smalltalk, изложенным 30 лет назад.

+4

Метаклассы работают по-разному в Ruby: они получают вводили в метод цепочки поиска, таким образом, Рубин не имеет две параллельные иерархии классов и метаклассов, но, как вы говорите, основы идентичны. –

+0

@Jorg: спасибо. Как только я закончу свой нынешний проект, я поднимусь на рельсы и рубин, я слышу столько похвал, что я заинтригован :) –

+0

Спасибо. Я думаю, что сейчас я понимаю отношения. @ Jörg_W_Mittag также помогает. То есть классы и метаклассы - это два разных, но связанных понятия. – fwoncn

5

Это так, как это работает в 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 
6

Object «s класс Class (так как Object сам класс), и Object является предком Class.

Существует круговая ссылка, она довольно сложная. Моя личная рекомендация, если вам действительно не нужно играть с ней, не ходите туда.

9

класса, объект, модуль и все другие классы экземпляры из класса класса :)

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

+0

Круговая зависимость работает, потому что это все встроенные классы. Они являются частью основной среды Ruby и настроены таким образом при запуске и не добавляются так, как вы обычно добавляете класс. Среда исполнения имеет право настраивать указатели, но она хочет, и дизайнер решил сделать это таким образом. –

Смежные вопросы