Объясните использование 'require' и 'include'.ruby-6

require - загрузка файлов

require используется для загрузки внешних файлов (библиотек, гемов, других Ruby-файлов) в текущую программу.

require 'json'
require './my_module.rb'

Ключевые особенности:

  1. Загружает файл только один раз (последующие вызовы игнорируются)
  2. Ищет файлы в $LOAD_PATH
  3. Может загружать:
    • Стандартные библиотеки (require 'net/http')
    • Гемы (require 'rails')
    • Локальные файлы (require_relative 'my_file')

Пример с проверкой:

unless defined?(SomeLibrary)
  require 'some_library'
end

include - примешивание модулей

include добавляет методы модуля в класс как instance methods.

module MyModule
  def module_method
    "Hello from module!"
  end
end

class MyClass
  include MyModule
end

obj = MyClass.new
obj.module_method # => "Hello from module!"

Важные аспекты:

  1. Методы модуля становятся частью класса
  2. Поддерживает multiple inclusion
  3. Определяет порядок в цепочке поиска методов (ancestor chain)

Проверка включенных модулей:

MyClass.ancestors # => [MyClass, MyModule, ...]

Сравнительная таблица

Характеристикаrequireinclude
НазначениеЗагрузка файловПримешивание модулей
Область действияГлобальнаяКласс/модуль
Повторный вызовИгнорируетсяДобавляет снова
Тип методов-Instance methods
Альтернативыrequire_relativeextend, prepend

Комбинированный пример

# В файле 'utilities.rb'
module Utilities
  def self.log(message)
    puts "[LOG] #{message}"
  end
end

# В основном файле
require './utilities'
include Utilities

Utilities.log("System started") # Вызов метода модуля

Особые случаи

  1. autoload - отложенная загрузка:

    autoload :MyModule, 'my_module'
    
  2. extend - добавление методов модуля как class methods:

    class MyClass
      extend MyModule
    end
    
  3. prepend - более высокий приоритет чем include:

    class MyClass
      prepend MyModule
    end
    

Резюмируем

  1. require - механизм загрузки внешнего кода:

    • Используется для библиотек и файлов
    • Выполняется однократно
    • Глобальная область видимости
  2. include - механизм примешивания модулей:

    • Добавляет методы модуля в класс
    • Работает с иерархией наследования
    • Локальная область видимости (в пределах класса)
  3. Для эффективной организации кода:

    • Используйте require для зависимостей
    • Применяйте include для DRY-принципа
    • Рассмотрите extend/prepend для специальных случаев