В чем разница между типом класса и суперклассом класса в ruby? - PullRequest
1 голос
/ 01 сентября 2011

Я сейчас в замешательстве после того, как написал свои неоднократные попытки понять объектную модель рубина: ниже приведены мои наблюдения.

class Bird
  def speak
   puts "tweet tweet"
  end
end

>> Bird.class
=> Class
>> Class.class
=> Class
>> Class.superclass
=> Module
>> Module.class
=> Class
>> Module.superclass
=> Object
>> Object.class
=> Class
>> Object.superclass
=> nil
>> nil.class
=> NilClass
>> NilClass.class
=> Class
>> NilClass.superclass
=> Object 
and keeps going on ....

Что здесь происходит? Что лежит на вершине предка ноль или NilClass или Object или Class? Как организована объектная модель Руби.

Что такое класс и что такое объект? Класс это класс или объект? Объект - это Объект или класс?

Ответы [ 5 ]

6 голосов
/ 01 сентября 2011

В 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как любой класс, который не указывает явный суперкласс.

2 голосов
/ 01 сентября 2011

Это немного сложно.В Ruby все является объектом (в зависимости от вашей версии).

  • У Nil есть свой собственный NilClass, так как он не допускает NilClass.new, который допускают объект и класс.Это объект, поэтому вы можете вызывать методы, например, nil.nil?и т.д.
  • Объект - это самый высокий класс, все наследует от объекта, даже NilClass
  • Класс также является объектом, он знает, как создавать экземпляры объектов из себя с помощью нового метода.

Поначалу это действительно странно, но я нашел объяснение Дейва Томаса весьма показательным.

См .: http://www.infoq.com/presentations/metaprogramming-ruby и http://pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming. Последнее является коммерческим.

2 голосов
/ 01 сентября 2011

Вы можете сделать вывод из вашего примера:

  1. Каждое имя, написанное в верхнем регистре в вашем примере сценария, указывает на класс (Bird, Class, Module, Object, NilClass).
  2. Каждый класс, в свою очередь, является объектом типа Class (поэтому X.class всегда возвращает Class в вашем примере).
  3. X.superclass возвращает базовый класс X.
  4. Object.superclass возвращает nil, потому что у него нет базового класса! Это означает NOT , что базовый класс Object равен NilClass или даже nil (который является не типом, а экземпляром)
  5. Диаграммы наследования участвующих классов выглядят примерно так:

    Object (top-level)      Object      Object
      |                       |           |
    Module                  Bird       NilClass
      |
    Class
    
1 голос
/ 01 сентября 2011

Class возвращает класс для объекта (а класс является объектом).Суперкласс является родительским классом (производного) класса.

Пожалуйста, см. Ruby Object Model .

0 голосов
/ 01 сентября 2011

Я думаю, вы запутались в разнице между экземплярами (например, nil) и классами (например, NilClass). Разумно посчитать это запутанным, потому что классы Ruby (NilClass) также являются экземплярами. Таким образом: класс является экземпляром. Экземпляр не является классом, хотя , если , это не класс.

Вот подробная иерархия , которая создается ObjectGraph .

...