При написании сложных программ на Ruby появляется необходимость каким-то образом компоновать файлы, раскидывать код для улучшения читабельности,
а также для повторного использования. В Ruby есть несколько методов, которые позволяют осуществить это как на уровне файлов так и на уровне кода.
Для организации файлов служат методы - load и require, а для организации кода - include и extend
load или require
load метод, позволяет включить файл в другой файл, при этом загрузка этого файла,
будет происходить каждый раз в момент вызова кода где указано подключение. Это полезно для разработки, когда вам нужно видеть результат изменений вживую.
Для примера код ниже. Есть какой-то модуль, в отдельном файле, и мы хотим его подключить в другой файл.
1 2 3 4 5 | |
1 2 3 4 5 6 | |
Метод require работает по-другому. При его использовании, подключаемый файл, загружается единоразово в память, и используется в дальнейшем из памяти.
Очевидно что при использовании такого способа подключения, программа будет работать быстрее. Но при разработке, вам придется постоянно перезапукать программу, чтобы
видеть изменения.
Используется он также как и load, require 'test_module'. При этом мы можем не указывать расширение .rb. Этот метод прекрасно сработает и без него.
include или extend
При организации кода внутри программы, нужно использовать методы - include или extend
Если вы видите повторяющийся код в вашей программе, его можно вынести в отдельный модуль, и подключать его внутрь с использованием include.
Например вот так:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
C помощью include методы модуля становятся доступными для выполнения в классе TestClass. Т.е. таким образом мы можем избавиться от дублирования кода,
перенся его в модуль и подключив там где нам это необходимо. Мы расширили класс, внедрив в него новые методы объекта.
При использовании extend, мы можем также внедрить новые методы, но это уже будут методы класса, а не объекта.
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Поэтому используйте extend если хотите расширить функционал класса и include для добавления функционала к объекту класса.