Ruby Module
Модуль — это способ объединения методов, классов и констант. Модули дают два основных преимущества.
- Модули предоставляютпространство имёни позволяют избежать конфликтов имён.
- Модули реализуютмеханизм миксинов.
Модуль определяет пространство имён, которое действует как песочница, в которой ваши методы и константы не конфликтуют с методами и константами из других мест.
Модули похожи на классы, но имеют следующие отличия:
- Модули нельзя инстанцировать
- Модули не имеют подклассов
- Модули могут быть определены только другим модулем
Синтаксис
Константы модуля именуются так же, как константы класса, и начинаются с заглавной буквы. Определения методов выглядят похоже: определения методов модуля аналогичны определениям методов класса.
Как и в случае с методами класса, вы можете вызвать метод модуля, поставив имя модуля и точку перед именем метода, а к константе можно обратиться, используя имя модуля и два двоеточия.
Пример
Мы можем определить несколько модулей с одинаковыми именами функций, но разной функциональностью:
Пример
Как и методы класса, когда вы определяете метод в модуле, вы можете указать имя модуля, затем точку, а затем имя метода.
Ruby requireОператор
Оператор require похож на оператор include в C и C++ и оператор import в Java. Если сторонняя программа хочет использовать любой определённый модуль, она может просто использовать Rubyrequireоператор, чтобы загрузить файл модуля:
Синтаксис
Синтаксис
Здесь расширение файла.rbне требуется.
Пример
Здесь мы используем$LOAD_PATH << '.', чтобы сообщить Ruby, что он должен искать текущий каталог для указанного файла. Если вы не хотите использовать $LOAD_PATH, то можете использоватьrequire_relative, чтобы сослаться на файл из относительного каталога.
Примечание:Здесь файлы содержат одинаковые имена функций. Таким образом, это вызвало бы неоднозначность кода при обращении к вызывающей программе, но модули избегают этой неоднозначности, и мы можем использовать имя модуля, чтобы вызвать соответствующую функцию.
Ruby includeОператор
Вы можете встраивать модули в класс. Чтобы встроить модуль в класс, можно использовать инструкциюinclude:
Синтаксис
Если модуль определён в отдельном файле, то перед встраиванием модуля нужно использовать инструкциюrequire, чтобы сослаться на файл.
Пример
Предположим, следующий модуль записан в файлеsupport.rb.
Теперь вы можете сослаться на модуль в классе следующим образом:
Пример
Это даст следующий результат:
Sunday You have four weeks in a month You have 52 weeks in a year Sunday 120
Миксины в Ruby
Прежде чем читать этот раздел, вам нужно базовое понимание концепций объектно-ориентированного программирования.
Когда класс может наследовать характеристики более чем от одного родительского класса, говорят, что класс демонстрирует множественное наследование.
Ruby напрямую не поддерживает множественное наследование, но модули Ruby обладают другой волшебной особенностью. Она почти устраняет необходимость в множественном наследовании, предоставляя механизммиксинов.
Ruby на самом деле не реализует множественное наследование, а вместо этого использует технику под названием миксин в качестве замены. Когда модуль включается в определение класса, методы модуля примешиваются в класс.
Давайте рассмотрим следующий пример кода, чтобы узнать больше о миксинах:
Пример
- Модуль A состоит из методов a1 и a2.
- Модуль B состоит из методов b1 и b2.
- Класс Sample включает модули A и B.
- Класс Sample может обращаться ко всем четырём методам, а именно: a1, a2, b1 и b2. Таким образом, можно увидеть, что класс Sample наследует от двух модулей. Можно сказать, что класс Sample использует множественное наследование или миксин 。