Ответ 1

Какая разница между "включить" и "потребовать" в Ruby?

Ответ:

Включить и потребовать, чтобы методы очень разные вещи.

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

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

Источник

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

Как ни странно, Ruby require аналогичен C include, а Ruby include почти не похож на C include.

Ответ 2

Из книги метабизнеса Ruby,

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

Ответ 3

Если вы используете модуль, это означает, что вы вводите все методы в свой класс.  Если вы extend класс с модулем, это означает, что вы "привносите" методы модуля в методы class.  Если вы include класс с модулем, это означает, что вы "привносите" методы модуля в методы instance.

Пример:

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

 class B
   include A
 end

 class C
   extend A
 end

B.say = > undefined метод 'say' для B: Class

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

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

C.new.say = > undefined метод 'say' для C: Class

Ответ 4

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

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

Существует хорошее объяснение здесь:

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

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

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

Добавлен акцент.

Ответ 5

Вы когда-нибудь пробовали require модуль? Каковы были результаты? Просто попробуйте:

MyModule = Module.new
require MyModule # see what happens

Модули не требуются, только включены!

Ответ 6

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

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

Ответ 7

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

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

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

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

Ответ 8

require(name)

Он вернет bolean true/false

Имя, которое передается как параметр в require, ruby ​​попытается найти исходный файл с этим именем в вашем пути загрузки.  Метод require возвращает false, если вы попытаетесь загрузить одну и ту же библиотеку после первого раза. Необходимый метод нужно использовать только в том случае, если библиотека, которую вы загружаете, определяется в отдельном файле. Поэтому он отслеживает, была ли эта библиотека уже загружена или нет.

include module_name

Предположим, есть ли у вас несколько методов, которые необходимо иметь в двух разных классах. Тогда вам не нужно писать их в обоих классах. Вместо этого вы можете определить это в модуле. А затем включите этот модуль в другие классы. Это обеспечивается Ruby только для обеспечения принципа DRY. Его использовали для СУШИЛЬНОГО кода, чтобы избежать дублирования.

Ответ 9

Включить

Когда вы include модуль в свой класс, как будто вы код, определенный в модуле и вставленный в класс, где вы его включаете. Это позволяет использовать поведение mixin. Его использовали для сушки ваш код, чтобы избежать дублирования, например, если было несколько классы, которые нуждаются в том же коде в модуле.

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 if вы пытаетесь загрузить одну и ту же библиотеку после первого раза. Требование метод должен использоваться только в том случае, если библиотека, которую вы загружаете, определяется в отдельный файл, который обычно имеет место.

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

Load

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

Extend

При использовании метода 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