Модули в 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