Ruby Module

Модуль — это способ объединения методов, классов и констант. Модули дают два основных преимущества.

  • Модули предоставляютпространство имёни позволяют избежать конфликтов имён.
  • Модули реализуютмеханизм миксинов.

Модуль определяет пространство имён, которое действует как песочница, в которой ваши методы и константы не конфликтуют с методами и константами из других мест.

Модули похожи на классы, но имеют следующие отличия:

  • Модули нельзя инстанцировать
  • Модули не имеют подклассов
  • Модули могут быть определены только другим модулем

Синтаксис

module Identifier statement1 statement2 ........... end

Константы модуля именуются так же, как константы класса, и начинаются с заглавной буквы. Определения методов выглядят похоже: определения методов модуля аналогичны определениям методов класса.

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

Пример

#!/usr/bin/ruby #Модуль, определённый в файле trig.rb module Trig PI = 3.141592654 def Trig.sin(x) # .. end def Trig.cos(x) # .. end end

Мы можем определить несколько модулей с одинаковыми именами функций, но разной функциональностью:

Пример

#!/usr/bin/ruby #Модуль, определённый в файле moral.rb module Moral VERY_BAD = 0 BAD = 1 def Moral.sin(badness) # ... end end

Как и методы класса, когда вы определяете метод в модуле, вы можете указать имя модуля, затем точку, а затем имя метода.

Ruby requireОператор

Оператор require похож на оператор include в C и C++ и оператор import в Java. Если сторонняя программа хочет использовать любой определённый модуль, она может просто использовать Rubyrequireоператор, чтобы загрузить файл модуля:

Синтаксис

Синтаксис

require filename

Здесь расширение файла.rbне требуется.

Пример

$LOAD_PATH << '.' require 'trig.rb' require 'moral' y = Trig.sin(Trig::PI/4) wrongdoing = Moral.sin(Moral::VERY_BAD)

Здесь мы используем$LOAD_PATH << '.', чтобы сообщить Ruby, что он должен искать текущий каталог для указанного файла. Если вы не хотите использовать $LOAD_PATH, то можете использоватьrequire_relative, чтобы сослаться на файл из относительного каталога.

Примечание:Здесь файлы содержат одинаковые имена функций. Таким образом, это вызвало бы неоднозначность кода при обращении к вызывающей программе, но модули избегают этой неоднозначности, и мы можем использовать имя модуля, чтобы вызвать соответствующую функцию.

Ruby includeОператор

Вы можете встраивать модули в класс. Чтобы встроить модуль в класс, можно использовать инструкциюinclude:

Синтаксис

include modulename

Если модуль определён в отдельном файле, то перед встраиванием модуля нужно использовать инструкциюrequire, чтобы сослаться на файл.

Пример

Предположим, следующий модуль записан в файлеsupport.rb.

module Week FIRST_DAY = "Sunday" def Week.weeks_in_month puts "У вас четыре недели в месяце" end def Week.weeks_in_year puts "У вас 52 недели в году" end end

Теперь вы можете сослаться на модуль в классе следующим образом:

Пример

#!/usr/bin/ruby $LOAD_PATH << '.' require "support" class Decade include Week no_of_yrs=10 def no_of_months puts Week::FIRST_DAY number=10*12 puts number end end d1=Decade.new puts Week::FIRST_DAY Week.weeks_in_month Week.weeks_in_year d1.no_of_months

Это даст следующий результат:

Sunday
You have four weeks in a month
You have 52 weeks in a year
Sunday
120

Миксины в Ruby

Прежде чем читать этот раздел, вам нужно базовое понимание концепций объектно-ориентированного программирования.

Когда класс может наследовать характеристики более чем от одного родительского класса, говорят, что класс демонстрирует множественное наследование.

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

Ruby на самом деле не реализует множественное наследование, а вместо этого использует технику под названием миксин в качестве замены. Когда модуль включается в определение класса, методы модуля примешиваются в класс.

Давайте рассмотрим следующий пример кода, чтобы узнать больше о миксинах:

Пример

module A def a1 end def a2 end end module B def b1 end def b2 end end class Sample include A include B def s1 end end samp=Sample.new samp.a1 samp.a2 samp.b1 samp.b2 samp.s1
  • Модуль A состоит из методов a1 и a2.
  • Модуль B состоит из методов b1 и b2.
  • Класс Sample включает модули A и B.
  • Класс Sample может обращаться ко всем четырём методам, а именно: a1, a2, b1 и b2.
  • Таким образом, можно увидеть, что класс Sample наследует от двух модулей. Можно сказать, что класс Sample использует множественное наследование или миксин 。

другие расширения.