Учебники

Ruby — Модули и Миксины

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

  • Модули обеспечивают пространство имен и предотвращают конфликты имен .

  • Модули реализуют смешанный механизм.

Модули обеспечивают пространство имен и предотвращают конфликты имен .

Модули реализуют смешанный механизм.

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

Синтаксис

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

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

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

пример

#!/usr/bin/ruby

# Module defined in trig.rb file

module Trig
   PI = 3.141592654
   def Trig.sin(x)
   # ..
   end
   def Trig.cos(x)
   # ..
   end
end

Мы можем определить еще один модуль с тем же именем функции, но с другой функциональностью —

#!/usr/bin/ruby

# Module defined in moral.rb file

module Moral
   VERY_BAD = 0
   BAD = 1
   def Moral.sin(badness)
   # ...
   end
end

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

Ruby требует утверждения

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

Синтаксис

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 modulename

Если модуль определен в отдельном файле, то перед включением модуля в класс необходимо включить этот файл с помощью оператора require .

пример

Рассмотрим следующий модуль, написанный в файле support.rb .

module Week
   FIRST_DAY = "Sunday"
   def Week.weeks_in_month
      puts "You have four weeks in a month"
   end
   def Week.weeks_in_year
      puts "You have 52 weeks in a year"
   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

Mixins в рубине

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

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

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

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

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

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 показывает множественное наследование или миксин .