Модули — это способ группировки методов, классов и констант. Модули дают вам два основных преимущества.
Модули определяют пространство имен, песочницу, в которой могут использоваться ваши методы и константы, не беспокоясь о том, что на них наступать другие методы и константы.
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
Как и методы класса, всякий раз, когда вы определяете метод в модуле, вы указываете имя модуля, за которым следует точка, а затем имя метода.
Оператор 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 в классе:
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 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.