English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Ruby базовый учебник

Ruby продвинутый учебник

Ruby модуль (Module)

Модуль (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

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

Ruby require продольной записи

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

Примечание:Здесь файл включает функции с одинаковыми именами. Поэтому это может привести к путанице при вызове функции, но модуль предотвращает это, и мы можем вызывать соответствующие функции по имени модуля.

Ruby include продольной записи

Вы можете嵌入 модуль в класс. Для嵌入 модуля в класс вы можете использовать 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

Mixins в Ruby

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

Когда класс может наследовать характеристики от нескольких родительских классов, он показывает多重ное наследование.

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 .