Поиск по сайту:
Беда тому, кто говорит все, что он может сказать (Ф. Вольтер).

Ruby — модули и микшины

[wtr-time]
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...
18.07.2018
Язык программирования Ruby

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

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

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

Синтаксис

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 требует Statement

Оператор 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 для включения файлов из относительного каталога.

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

Заявление include в Ruby

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

Синтаксис

include modulename

 

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

Пример

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

module Week
   FIRST_DAY = "Воскресенье"
   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

 

Это приведет к следующему результату:

Воскресенье
У вас четыре недели в месяце
У вас есть 52 недели в году
Воскресенье
120

Микшины в Ruby

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

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

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

Mixins дают вам прекрасно контролируемый способ добавления функциональности к классам. Однако их истинная власть возникает, когда код в 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

 

Модуль А состоит из методов a1 и a2. Модуль B состоит из методов b1 и b2. Образец класса включает в себя оба модуля A и B. Образец класса может обращаться ко всем четырем методам, а именно a1, a2, b1 и b2. Поэтому вы можете видеть, что класс Sample наследуется от обоих модулей. Таким образом, вы можете сказать, что класс Sample показывает множественное наследование или mixin.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Если статья понравилась, то поделитесь ей в социальных сетях:

Читайте также

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

**ссылки nofollow

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Спасибо!

Теперь редакторы в курсе.