Модули в Ruby аналогичны классам, за исключением:
* модуль не может иметь представителей.
* модуль не может иметь подклассов.
* модуль определяется конструкцией module ... end.
На самом деле... класс Module модуля является суперклассом класса Class класса. Понятно? Нет? Едем дальше.
Существуют два типа модулей. Один предназначен для централизованного хранения методов и констант. Модуль Math в стандартной библиотеке Ruby выступает в данной роли:
ruby> Math.sqrt(2)
1.41421
ruby> Math::PI
3.14159
Оператор :: указывает интерпретатору Ruby местоположение константы (возможно, некоторые модули кроме Math определяют значение PI несколько иначе). Если мы хотим прямо ссылаться на методы или константы модуля без использования ::, мы можем включить (include) нужный модуль:
ruby> include Math
Object
ruby> sqrt(2)
1.41421
ruby> PI
3.14159
Другим способом использования модулей является миксин (mixin). Некоторые ОО языки программирования, включая С++, допускают множественное наследование , то есть наследование от более чем одного суперкласса. Примером множественного наследования из реальной жизни может служить будильник; можно считать, что будильник принадлежит к классу часы и также к классу жужжалка.
Ruby умышленно не разрешает множественное наследование, но техника mixin-ов является хорошей альтернативой. Помните, что модули не могут быть инстанциированы и от них нельзя образовать подклассы; но если мы включаем (include) модуль в определение класса, его методы добавляются, или подмешиваются ("mixed in") в класс.
Миксины можно рассматривать с позиций того, какие частные свойства мы хотим получить. Например, если у класса есть работающий метод each, включая в него модуль Enumerable из стандартной библиотеки бесплатно дает нам методы sort и find.
Подобное использование модулей дает нам простейшую функциональность множественного наследования, но дает возможность представить взаимоотношения классов простой структурой дерева, а также значительно упрощает реализацию языка (подобный выбор также был сделан дизайнерами Java).
Источник: www.opennet.ru
К началу статьи