Блог Ruby-разработчика

В чем разница между Load и Require, Include и Extend

| Comments

При написании сложных программ на Ruby появляется необходимость каким-то образом компоновать файлы, раскидывать код для улучшения читабельности, а также для повторного использования. В Ruby есть несколько методов, которые позволяют осуществить это как на уровне файлов так и на уровне кода.

Для организации файлов служат методы - load и require, а для организации кода - include и extend

load или require

load метод, позволяет включить файл в другой файл, при этом загрузка этого файла, будет происходить каждый раз в момент вызова кода где указано подключение. Это полезно для разработки, когда вам нужно видеть результат изменений вживую.

Для примера код ниже. Есть какой-то модуль, в отдельном файле, и мы хотим его подключить в другой файл.

test_module.rb
1
2
3
4
5
module TestModule
  def some_method
    # ...
  end
end
test_class.rb
1
2
3
4
5
6
load 'test_module.rb'
class TestClass
  def some_method
    # ...
  end
end

Метод require работает по-другому. При его использовании, подключаемый файл, загружается единоразово в память, и используется в дальнейшем из памяти. Очевидно что при использовании такого способа подключения, программа будет работать быстрее. Но при разработке, вам придется постоянно перезапукать программу, чтобы видеть изменения.

Используется он также как и load, require 'test_module'. При этом мы можем не указывать расширение .rb. Этот метод прекрасно сработает и без него.

include или extend

При организации кода внутри программы, нужно использовать методы - include или extend Если вы видите повторяющийся код в вашей программе, его можно вынести в отдельный модуль, и подключать его внутрь с использованием include. Например вот так:

1
2
3
4
5
6
7
8
9
10
11
12
13
module TestModule
  def some_method
    "Some method of #{self.class}"
  end
end

class TestClass
  include TestModule
  # ...
end

puts TestClass.new.some_method
=> 'Some method of TestClass'

C помощью include методы модуля становятся доступными для выполнения в классе TestClass. Т.е. таким образом мы можем избавиться от дублирования кода, перенся его в модуль и подключив там где нам это необходимо. Мы расширили класс, внедрив в него новые методы объекта.

При использовании extend, мы можем также внедрить новые методы, но это уже будут методы класса, а не объекта.

1
2
3
4
5
6
7
8
9
10
11
12
13
module TestModule
  def some_method
    "Some method of #{self.class}"
  end
end

class TestClass
  extend TestModule
  # ...
end

puts TestClass.some_method
=> 'Some method of Class'

Поэтому используйте extend если хотите расширить функционал класса и include для добавления функционала к объекту класса.

Comments