English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Модуль (Module) - это способ комбинировать методы, классы и константы. Модуль (Module) предоставляет вам два больших преимущества.
Модуль предоставляетпространство имени предотвращает конфликты имен.
Модуль реализует mixin устройства.
Модуль (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
как метод класса, когда вы определяете метод в модуле, вы можете указать имя модуля после точки, за которой следует имя метода.
оператор require аналогичен оператору include в C и C++, а также import в 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 знать, что необходимо искатьreferenced файлы в текущем каталоге. Если вы не хотите использовать $LOAD_PATH, вы можете использовать require_relative для ссылки на файл из относительного каталога.
Примечание:Здесь файл включает функции с одинаковыми именами. Поэтому это может привести к путанице при вызове функции, но модуль предотвращает это, и мы можем вызывать соответствующие функции по имени модуля.
Вы можете嵌入 модуль в класс. Для嵌入 модуля в класс вы можете использовать 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 У вас есть четыре недели в месяце У вас есть 52 недели в году Sunday 120
Прежде чем читать этот раздел, вам нужно сначала ознакомиться с концепцией объектно-ориентированного программирования.
Когда класс может наследовать характеристики от нескольких родительских классов, он показывает多重ное наследование.
Ruby не поддерживает多重ное наследование напрямую, но у модулей (Module) Ruby есть другая神奇кая функция. Она почти устраняет необходимость в多重ном наследовании, предоставляя функциональность под названием mixin устройства.
Ruby не真正实现了多重继承机制,а вместо этого использует технологию mixin в качестве заменителя. Включение модуля в определение класса позволяет методам модуля смешиваться с методами класса.
Давайте посмотрим на следующий пример кода, чтобы лучше понять 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 использует множественное наследование или mixin .