В чем разница между include и require в Ruby? - PullRequest
445 голосов
/ 25 ноября 2008

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

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

Ответы [ 11 ]

528 голосов
/ 25 ноября 2008

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

Ответ:

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

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

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

Источник

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

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

88 голосов
/ 08 января 2013

Если вы используете модуль, это означает, что вы вводите все методы в свой класс. Если вы extend класс с модулем, это означает, что вы "вводите" методы модуля как class методы. Если вы 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: Класс

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

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

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

88 голосов
/ 21 мая 2011

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

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

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

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

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

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

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

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

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

7 голосов
/ 25 августа 2014

С Программирование на Ruby 1.9

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

7 голосов
/ 12 июня 2013

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

MyModule = Module.new
require MyModule # see what happens

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

3 голосов
/ 27 ноября 2014

Включить Когда вы включаете модуль в свой класс, как показано ниже, это как если бы вы взяли код, определенный в модуле, и вставили его в класс, куда вы его «включили». Это позволяет "смешивать" поведение. Он используется, чтобы высушить ваш код, чтобы избежать дублирования, например, если было несколько классов, для которых в модуле требовался бы один и тот же код.

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

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

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

2 голосов
/ 04 января 2016
require(name)

Возвращает логическое значение true / false

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

include module_name

Предположим, если у вас есть несколько методов, которые вам нужны в двух разных классах. Тогда вам не нужно писать их в обоих классах. Вместо этого вы можете определить это в модуле. А затем включить этот модуль в другие классы. Он предоставляется Ruby только для обеспечения принципа СУХОЙ. Он используется, чтобы высушить ваш код, чтобы избежать дублирования

1 голос
/ 28 февраля 2018

Ниже приведены несколько основных различий между require и include:

Требуется:

  1. Require считывает файл из файловой системы, анализирует его, сохраняет в памяти и запускает его в заданном месте, что означает, что если вы даже измените что-либо во время выполнения скрипта, это изменение не отразится.
  2. Требуется файл по имени, а не по имени модуля.
  3. Обычно используется для библиотек и расширений.

Включено:

  1. Когда вы включаете модуль в ваш класс, он ведет себя так, как будто вы взяли код, определенный в вашем модуле, и вставили его в свой класс.
  2. Мы включаем имя модуля, а не имя файла.
  3. Обычно используется для сушки кода и устранения дублирования в коде.
1 голос
/ 17 ноября 2017

Включить

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

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

Load

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

Продлить

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

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

class TestClass 
  extend Log 
  # ... 
end

tc = TestClass.class_type
...