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