2012-05-31 3 views
3

На первый взгляд я думал BasicObject просто «полагает» Class (читай: Class наследуется от BasicObject)Что входит в Ruby Class или BasicObject?

Class.ancestors #=> [Class, Module, Object, Kernel, BasicObject] 
Module.ancestors #=> [Module, Object, Kernel, BasicObject] 
Object.ancestors #=> [Object, Kernel, BasicObject] 
BasicObject.ancestors #=>[BasicObject] 

Но все вдруг стали весьма любопытно.

Class.class #=> Class 
Module.class #=> Class 
Object.class #=> Class 
BasicObject.class #=> Class 

"Ага, подумал я." Мы на самом деле делает экземпляр Class: BasicObject = Class.new. Но потом я вспомнил, что все эти случаи сидят в иерархии с Class внизу: Class < Module < Object < Kernel < BasicObject.

Каждый из этих классов одновременно является объектом. В свою очередь, система кажется очень круговой. Где начинается иерархия и как она сочетается с самим собой, чтобы сформировать абстрактные конструкции Ruby?

+1

Я бы как ссылку [этот отличный ответ] (http://stackoverflow.com/a/10526013/512904) [Jörg W Mittag] (http://stackoverflow.com/users/2988/jorg-w-mittag). Я думаю, что это дает очень хорошее описание отношений между фундаментальными классами Ruby. –

+1

Прозрачная цитата из этого ответа: «BasicObject, Object, Module и Class все должны возникать одновременно, потому что они имеют круговые зависимости». – fny

ответ

1

В Ruby все объекты (< BasicObject), и так класс. Класс является объектом класса Class. Объект класса Object не обязательно является классом. Однако класс Object является классом, обязательно, и поэтому является классом BasicObject. Понял? Нет? Давайте двигаться дальше. (Как говорит Мац в своем интро :)))

(Другими словами, вы получили это право.)

1

Re открытия зомби вопрос, чтобы добавить свою красивую диаграмму :)

*Class* 
    ↓ 
BasicObject ~= 'Parent class of all classes but "inherits" from [Class] - causing an interrelated loop' 
    ↓ 
Object  ~= Class.new(BasicObject) {} 
    ↓ 
Module  ~= Class.new(Object) {} 
    ↓ 
*Class*  ~= Class.new(Module) {} 
Смежные вопросы