require_relative - В чем разница между include и require в Ruby?




ruby require_relative (7)

Мой вопрос похож на «В чем разница между включением и расширением в Ruby? ».

В чем разница между require и include в Ruby? Если я просто хочу использовать методы из модуля в моем классе, должен ли я require его или include его?


В чем разница между «включать» и «требовать» в Ruby?

Ответ:

Методы include и require имеют очень разные вещи.

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

Метод include принимает все методы из другого модуля и включает их в текущий модуль. Это вещь на уровне языка, в отличие от вещи на уровне файлов, как и требует. Метод include - это основной способ «расширить» классы с помощью других модулей (обычно называемых mix-ins). Например, если ваш класс определяет метод «каждый», вы можете включить модуль mixin Enumerable и он может выступать в качестве коллекции. Это может сбивать с толку, поскольку глагол include используется по-разному на других языках.

Source

Поэтому, если вы просто хотите использовать модуль, а не расширять его или делать микс-в, то вы захотите использовать require .

Как ни странно, требование Ruby аналогично include C, в то время как Ruby's include почти ничего не напоминает, например, C.


Включить Когда вы включаете модуль в свой класс, как показано ниже, он как будто вы взяли код, определенный в модуле, и вставили его в класс, где вы его включаете. Это позволяет «смешивать» поведение. Он используется для СУШИЛЬНОГО кода, чтобы избежать дублирования, например, если было несколько классов, для которых необходим один и тот же код в модуле.

Загрузка Метод загрузки почти аналогичен методу require, за исключением того, что он не отслеживает, загружена ли эта библиотека. Таким образом, можно загружать библиотеку несколько раз, а также при использовании метода загрузки вы должны указать расширение «.rb» имени файла библиотеки.

Требовать Метод require позволяет загружать библиотеку и предотвращать ее загрузку более одного раза. Метод require вернет «false», если вы попытаетесь загрузить одну и ту же библиотеку после первого раза. Метод require должен использоваться только в том случае, если библиотека, которую вы загружаете, определяется в отдельном файле, что обычно происходит.

Вы можете предпочесть этот http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-include-vs-extend/


Если вы используете модуль, это означает, что вы вводите все методы в свой класс. Если вы extend класс с помощью модуля, это означает, что вы «вводите» методы модуля в качестве методов класса . Если вы include класс с модулем, это означает, что вы «внедряете» методы модуля в качестве методов экземпляра .

EX:

 module A
   def say
     puts "this is module A"
   end
 end

 class B
   include A
 end

 class C
   extend A
 end

B.say => неопределенный метод 'say' для B: Class

B.new.say => это модуль A

C.say => это модуль A

C.new.say => неопределенный метод 'say' для C: Class


Из книги метапрограммирования Ruby,

Метод require() очень похож на load() , но он предназначен для другой цели. Вы используете load() для выполнения кода, и вы используете require() для импорта библиотек.


От программирования Ruby 1.9

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


Включают

Когда вы include модуль в свой класс, это как если бы вы взяли код, определенный внутри модуля, и вставили его в класс, где вы включили его. Это позволяет «смешивать» поведение. Он используется для СУШИЛЬНОГО кода, чтобы избежать дублирования, например, если было несколько классов, для которых необходим один и тот же код в модуле.

module Log 
  def class_type
    "This class is of type: #{self.class}"
  end
end

class TestClass 
  include Log 
  # ... 
end

tc = TestClass.new.class_type # -> success
tc = TestClass.class_type # -> error

требовать

Метод require позволяет загружать библиотеку и предотвращать ее загрузку более одного раза. Метод require вернет «false», если вы попытаетесь загрузить одну и ту же библиотеку после первого раза. Метод require должен использоваться только в том случае, если библиотека, которую вы загружаете, определяется в отдельном файле, что обычно происходит.

Поэтому он отслеживает, была ли эта библиотека уже загружена или нет. Вам также не нужно указывать расширение «.rb» имени файла библиотеки. Вот пример использования require. Поместите требуемый метод в самый верх файла «.rb»:

нагрузка

Метод загрузки похож на метод require, за исключением того, что он не отслеживает, загружена ли эта библиотека. Таким образом, можно загружать библиотеку несколько раз, а также при использовании метода загрузки вы должны указать расширение «.rb» имени файла библиотеки.

простираться

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

module Log 
  def class_type
    "This class is of type: #{self.class}"
  end
end

class TestClass 
  extend Log 
  # ... 
end

tc = TestClass.class_type

  • Требование Ruby больше похоже на «включить» на другие языки (например, C). Он сообщает Ruby, что вы хотите добавить содержимое другого файла . Аналогичные механизмы на других языках:

  • Ruby include - это объектно-ориентированный механизм наследования, используемый для mixins .

Здесь есть хорошее объяснение:

[The] простой ответ заключается в том, что требование и включение по существу не связаны.

«require» похож на C include, что может вызвать путаницу новичков. (Одна заметная разница заключается в том, что локали внутри требуемого файла «испаряются», когда требуется выполнение.)

Ruby include не похож на C include. Оператор include «смешивает» модуль с классом. Это ограниченная форма множественного наследования . Включенный модуль буквально наделяет «is-a» отношениями на предмет, включая его.

Акцент добавлен.





require