При написании сложных программ на 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
для добавления функционала к объекту класса.