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

мой вопрос похож на "в чем разница между include и extend в Ruby?".

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

10 ответов


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

ответ:

методы include и require делают совсем разные вещи.

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

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

источник

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

как ни странно, Руби require аналогично C include, в то время как Руби include почти ничего похожего на C include.


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

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


если вы используете модуль, это означает, что вы приносите все методы в свой класс. Если ты ... --1--> класс с модулем, это означает, что вы" вводите " методы модуля как класс методы. Если ты ... --2--> класс с модулем, это означает, что вы" вводите " методы модуля как экземпляр методы.

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 => вот модуль

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

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


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

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

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

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

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

    Курсив.


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

MyModule = Module.new
require MyModule # see what happens

модули не могут быть обязательными, только включены!


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

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


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

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

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

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


require(name)

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

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

include module_name

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


включить

когда вы 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 " расширение файла библиотеки имя.

расширения

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

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

требуется:

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

включает:

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