Модули в Ruby: Часть II

В этой статье мы собираемся изучить следующие темы:

  • Module.new
  • Анонимные модули
  • Module и Class

Не стесняйтесь читать Часть 1, если вы не знакомы с пространством имен и возможностью микширования в Ruby.

Прежде, чем начать

Позвольте мне представить здесь платформу, которая помогла мне изучить большую часть моих знаний о Ruby. Действительно, Pluralsight - потрясающая платформа.

С 50+ курсами, которые охватывают различные темы по Ruby и Ruby on Rails, это лучший способ поднять свои знания на новый уровень!

Попробуйте бесплатно 👇😉



Спасибо за уделенное время!

Вступление

Ruby - это полностью объектно-ориентированный язык программирования.

Как мы видели в статье классы в Ruby, класс на самом деле является экземпляром класса Class.

Итак, как вы догадались, модуль сильно коррелирован с Module.

Module.new

В части I мы видели, что в Ruby ключевое слово module позволяет определить новый модуль

Давайте посмотрим, как определить точно такой же модуль в Ruby без использования ключевого слова module

Метод Module.new возвращает объект типа Module.

Этот объект мы обычно называем модулем в Ruby.

По умолчанию экземпляр Module может быть отнесен к концепции анонимного модуля.

Но факт сохранения этого экземпляра в константе - например, Greeting - изменяет состояние этого экземпляра с анонимного на именованный модуль.

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

Обратите внимание, что мы можем получить доступ к имени экземпляра Module через метод Module#name.

Анонимные модули

Как мы видели в предыдущем разделе, когда новый экземпляр Module назначается чему-либо, кроме константы, модуль остается анонимным.

Здесь переменная m содержит экземпляр Module.

Вызов m.name возвращает nil, поскольку модуль является анонимным.

Поэтому мы называем этот экземпляр анонимным модулем.

Что произойдет, если мы назначим этот анонимный модуль константе?

Здесь мы видим, что модуль m переходит от анонимного к именованному модулю после присвоения его константе.

Теперь мы можем использовать метод m.yo, вызвав Mod.yo.

Также обратите внимание, что вызов метода m.name возвращает "Mod" после того, как переменная m присвоена константе Mod.

Модуль и класс

Module и Class друзья не только синтаксически.

У них также есть два секрета.

Давайте посмотрим на superclass класса Class, чтобы понять это

irb> Class.superclass
 => Module

Class напрямую наследуется от Module!

Итак, Class - это специализация Module.

А теперь давайте посмотрим, что такое Module?

irb> Module.class
 => Class

Module является экземпляром класса Class!

Итак, резюмируем:

Определение класса в Ruby

Класс - это экземпляр класса Class, хранящийся в константе.

Класс Class - это специализация класса Module, экземпляры которого могут быть созданы.

Определение модуля в Ruby

Модуль - это экземпляр класса Module, хранящийся в константе.

Класс Module - это экземпляр класса Class, хранящийся в константе, экземпляры которого не могут быть созданы.

Вуаля!

Спасибо, что нашли время прочитать этот пост :-)

Не стесняйтесь 👏 и поделитесь этой статьей, если она была для вас полезна. 🚀

Вот ссылка на мою последнюю статью: Modules in Ruby: Part I