11.2.7. Как работает включение модулей?

11.2.7. Как работает включение модулей?

Когда модуль включается в класс, Ruby на самом деле создает прокси-класс, являющийся непосредственным родителем данного класса. Возможно, вам это покажется интуитивно очевидным, возможно, нет. Все методы включаемого модуля «маскируются» методами, определенными в классе.

module MyMod

 def meth

  "из модуля"

 end

end

class ParentClass

 def meth

  "из родителя"

 end

end

class ChildClass < ParentClass

 include MyMod

 def meth

  "из потомка"

 end

end

x = ChildClass.new p

p x.meth # Из потомка.

Выглядит это как настоящее наследование: все, что потомок переопределил, становится действующим определением вне зависимости от того, вызывается ли include до или после переопределения.

Вот похожий пример, в котором метод потомка вызывает super, а не просто возвращает строку. Как вы думаете, что будет возвращено?

# Модуль MyMod и класс ParentClass не изменились.

class ChildClass < ParentClass

 include MyMod

 def meth

  "Из потомка: super = " + super

 end

end

x = ChildClass.new

p x.meth # Из потомка: super = из модуля

Отсюда видно, что модуль действительно является новым родителем класса. А что если мы точно также вызовем super из модуля?

module MyMod

 def meth

  "Из модуля: super = " + super

 end

end

# ParentClass не изменился.

class ChildClass < ParentClass

 include MyMod

 def meth

  "Из потомка: super = " + super

 end

end

x = ChildClass.new

p x.meth # Из потомка: super = из модуля: super = из родителя.

Метод meth, определенный в модуле MyMod, может вызвать super только потому, что в суперклассе (точнее, хотя бы в одном из его предков) действительно есть метод meth. А что произошло бы, вызови мы этот метод при других обстоятельствах?

module MyMod

 def meth

  "Из модуля: super = " + super

 end

end

class Foo include MyMod

end

x = Foo.new

x.meth

При выполнении этого кода мы получили бы ошибку NoMethodError (или обращение к методу method_missing, если бы таковой существовал).

Данный текст является ознакомительным фрагментом.



Поделитесь на страничке

Похожие главы из других книг:

Сборка модулей

Из книги автора

Сборка модулей Благодаря новой системе сборки "kbuild", в ядрах серии 2.6 сборка модулей выполняется значительно проще, чем в старых сериях. Первое, что нужно сделать при сборке модулей, — это решить, где будет находиться исходный код модуля. Исходный код модуля необходимо


Инсталляция модулей

Из книги автора

Инсталляция модулей Скомпилированные модули должны быть инсталлированы в каталог /lib/modules/version/kernel. Например, для ядра 2.6.10 скомпилированный модуль управления удочкой будет находиться в файле /lib/modules/2.6.10/kernel/drivers/char/fishing.ko, если исходный код находился непосредственно в


Загрузка модулей

Из книги автора

Загрузка модулей Наиболее простой способ загрузки модуля — это воспользоваться утилитой insmod. Эта утилита выполняет самые общие действия. Она просто загружает тот модуль, который ей указан в качестве параметра. Утилита insmod не отслеживает зависимости и не выполняет


Параметры модулей

Из книги автора

Параметры модулей Ядро Linux предоставляет возможность драйверам определять параметры, которые пользователь будет указывать при загрузке ядра или модуля. Эти параметры будут доступны коду модуля в качестве глобальных переменных. Указанные параметры модулей также будут


Вокруг модулей

Из книги автора

Вокруг модулей В этой главе были рассмотрены особенности написания, сборки, загрузки и выгрузки модулей ядра. Мы обсудили, что такое модули и каким образом ядро операционной системы Linux, несмотря на то что оно является монолитным, может загружать код динамически. Были


17.5.6. Компиляция модулей

Из книги автора

17.5.6. Компиляция модулей Если вы сконфигурировали какие-то драйверы как отдельные модули (выбирали при конфигурации вариант "m" при ответе на некоторые вопросы), то вы теперь должны еще выполнить команду make modules, а затем еще команду make modules_install. В файле Documentation/modules.txt можно


7.2.2. Загрузка дополнительных модулей

Из книги автора

7.2.2. Загрузка дополнительных модулей В первую очередь, командой /sbin/depmod -a, выполняется проверка зависимостей модулей после чего производится подгрузка модулей, необходимых для работы сценария. Старайтесь в ваших сценариях загружать только необходимые модули. Например,


Приложение 2 100 SEO-модулей

Из книги автора

Приложение 2 100 SEO-модулей 1. Модуль сбора позиций.2. Модуль генерации ЧПУ.3. Модуль генерации Description.4. Модуль генерации Title.5. Модуль генерации H1.6. Ловец ботов.7. Модуль перелинковки для улучшения анкорного ранжирования.8. Модуль перелинковки для индексации новых страниц.9.


Включение

Из книги автора

Включение Не все классы способны к агрегированию. Для того чтобы выставить неагрегируемые классы как часть индивидуальности другого объекта, необходимо, чтобы внешние объекты явно передавали вызовы методов внутренним объектам. Эта технология СОМ часто называется


Конструирование модулей

Из книги автора

Конструирование модулей Введение Эта обучающая серия обещает стать возможно одной из самых долгоиграющих мини-серий в истории, конкурирующей только с задержкой на Томе IV Кнута. Начатая в 1988, эта серия вошла в четырехлетнюю паузу в 1990, когда «заботы мира сего», изменения


Планирование модулей

Из книги автора

Планирование модулей Нельзя сказать, что проблема организации модулей слишком сложна. Имеет смысл подумать только над тем, сколько модулей следует создать и какие процедуры должны в них войти. Вот те моменты, о которых нужно при этом помнить.Процедуры могут вызывать или


5.6. Диаграммы модулей

Из книги автора

5.6. Диаграммы модулей Существенное: модули и их зависимость Диаграмма модулей показывает распределение классов и объектов по модулям в физическом проектировании системы. Каждая отдельная диаграмма модулей представляет некоторый ракурс структуры модулей системы. При


11.2.2. Загрузка серверных модулей

Из книги автора

11.2.2. Загрузка серверных модулей В файле module.c (листинг 11.3) содержится реализация динамически загружаемых серверных модулей. Загруженному модулю соответствует структура типа server_module, который определен в файле server.h.Листинг 11.3. (module.c) Загрузка и выгрузка серверных


Тестирование модулей

Из книги автора

Тестирование модулей Тестирование модулей (unit testing) представляет собой процесс тестирования отдельных частей независимо от самой программы.Одним из новых методов разработки программного обеспечения, который появился уже при написании этой книги, является


Разработка модулей

Из книги автора

Разработка модулей Разработка модулей PSQL является жизненно важной частью деятельности, как разработчика, так и администратора базы данных. Поскольку запросы администратора Firebird ясны, обычно на практике эти две роли объединяются. В процессе разработки обычно довольно