В ruby, объект класса, на самом деле является экземпляром класса Class
.class Foo
почти идентичен Foo = Class.new
MyClass = Class.new
instance = MyClass.new
puts instance # => #<MyClass:0x100c14b38>
Кроме того, метод class
больше подходит для вызова экземпляров, а не объектов классов.
class Foo
end
f = Foo.new
puts f.class # => Foo
Семантикаможет быть странным при вызове объектов класса.Хотя superclass
работает, как и следовало ожидать, для объекта класса.
Итак, учитывая все, что позволяет объяснить это один за другим:
>> Bird.class
=> Class
Bird
объект класса имеет классClass
, поскольку все объекты класса являются экземплярами класса Class
.
>> Class.class
=> Class
Да, даже Class
является экземпляром Class
.В данном случае это фактически циклическая ссылка.
>> Class.superclass
=> Module
Класс Class
на самом деле наследуется от Module
.В конце концов, класс - это просто модуль, который может быть создан.Но все неэкземплярные функциональные возможности довольно идентичны модулям.
>> Module.superclass
=> Object
Module
наследуется от Object
.Точно так же, как все в ruby, если вы вернетесь достаточно далеко.
>> Object.class
=> Class
Опять все объекты класса являются экземплярами Class
.
>> Object.superclass
=> nil
Все ruby все начинается с Object
.Это базовый класс для всего.Поэтому у него нет суперкласса.
>> nil.class
=> NilClass
nil
фактически является экземпляром NilClass
под капотом.NilClass
определяет методы, на которые nil
отвечает.Вы можете даже добавить методы к NilClass
, если хотите.Существует также TrueClass
и FalseClass
.
>> NilClass.class
=> Class
Опять все объекты класса являются экземплярами Class
.
>> NilClass.superclass
=> Object
NilClass
наследуется от Object
как любой класс, который не указывает явный суперкласс.