Мой вопрос похож на "В чем разница между включением и расширением в Ruby?".
В чем разница между require
и include
в Ruby? Если я просто хочу использовать методы из модуля в моем классе, должен ли я require
он или include
его?
Мой вопрос похож на "В чем разница между включением и расширением в Ruby?".
В чем разница между require
и include
в Ruby? Если я просто хочу использовать методы из модуля в моем классе, должен ли я require
он или include
его?
Какая разница между "включить" и "потребовать" в Ruby?
Ответ:
Включить и потребовать, чтобы методы очень разные вещи.
Метод require делает то, что включает делает в большинстве других программ Языки: запустить другой файл. Это также отслеживает, что вы требовали в прошлое и не будет требовать того же файла дважды. Для запуска другого файла без это добавленная функциональность, вы можете использовать метод загрузки.
Метод включения принимает все методы из другого модуля и включает их в текущий модуль. Это вещь на уровне языка, как против файлового уровня, как с требуют. Метод включения - это основной способ "расширить" классы с помощью другие модули (обычно называемые Mix-Ins). Например, если ваш класс определяет метод "каждый", вы можете включить модуль mixin Enumerable и он может выступать в качестве коллекции. Эта может сбивать с толку, поскольку глагол include используется по-разному в других языки.
Итак, если вы просто хотите использовать модуль, а не расширять его или делать микширование, тогда вы захотите использовать require
.
Как ни странно, Ruby require
аналогичен C include
, а Ruby include
почти не похож на C include
.
Из книги метабизнеса Ruby,
Метод
require()
очень похож наload()
, но он предназначен для другая цель. Вы используетеload()
для выполнения кода, и используетеrequire()
для импорта библиотек.
Если вы используете модуль, это означает, что вы вводите все методы в свой класс. Если вы 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
Ruby require
больше похож на "include" на других языках (например, на C). Он сообщает Ruby, что вы хотите добавить содержимое другого файла. Аналогичные механизмы на других языках:
Ruby include
- это объектно-ориентированный механизм наследования , используемый для mixins.
Существует хорошее объяснение здесь:
[The] простой ответ заключается в том, что require и include по существу не связаны.
"require" похож на C include, что может вызвать путаницу новичков. (Одна заметная разница заключается в том, что локали внутри требуемого файла "испаряются" когда требуется выполнение.)
Ruby include не похож на C include. Оператор include "смешивает" модуль с классом. Это ограниченная форма множественного наследования. Включенный модуль буквально дает "is-a", отношения к предмету, включая его.
Добавлен акцент.
Вы когда-нибудь пробовали require
модуль? Каковы были результаты? Просто попробуйте:
MyModule = Module.new
require MyModule # see what happens
Модули не требуются, только включены!
От программирования Ruby 1.9
Хорошо сделайте пару моментов в отношении заявления include, прежде чем мы продолжим. Во-первых, он ничего общего с файлами. Программисты C используют директиву препроцессора с именем #include для вставляйте содержимое одного файла в другое во время компиляции. Инструкция Ruby include просто делает ссылку на модуль. Если этот модуль находится в отдельном файле, вы должны использовать требуют (или его менее часто используемого кузена, нагрузки) для перетаскивания этого файла перед использованием include. Во-вторых, Ruby include не просто копирует методы экземпляров модулей в класс. Вместо этого он ссылается от класса на включенный модуль. Если несколько классов включите этот модуль, все они указывают на одно и то же. Если вы измените определение метод внутри модуля, даже если ваша программа запущена, все классы, которые включают в себя модуль будет демонстрировать новое поведение.
Включить Когда вы включаете модуль в свой класс, как показано ниже, его как будто вы взяли код, определенный в модуле, и вставили его в класс, где вы его включили. Это позволяет использовать поведение mixin. Его использовали для СУШИЛЬНОГО кода, чтобы избежать дублирования, например, если было несколько классов, которые нуждались бы в том же коде в модуле.
Загрузить Метод загрузки почти аналогичен методу require, за исключением того, что он не отслеживает, загружена ли эта библиотека. Таким образом, можно загружать библиотеку несколько раз, а также при использовании метода загрузки вы должны указать расширение ".rb" имени файла библиотеки.
Требуют Метод require позволяет загружать библиотеку и предотвращать ее загрузку более одного раза. Метод require возвращает false, если вы попытаетесь загрузить одну и ту же библиотеку после первого раза. Необходимый метод нужно использовать только в том случае, если библиотека, которую вы загружаете, определяется в отдельном файле, что обычно происходит.
Вы можете предпочесть http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-include-vs-extend/
require(name)
Он вернет bolean true/false
Имя, которое передается как параметр в require, ruby попытается найти исходный файл с этим именем в вашем пути загрузки. Метод require возвращает false, если вы попытаетесь загрузить одну и ту же библиотеку после первого раза. Необходимый метод нужно использовать только в том случае, если библиотека, которую вы загружаете, определяется в отдельном файле. Поэтому он отслеживает, была ли эта библиотека уже загружена или нет.
include module_name
Предположим, есть ли у вас несколько методов, которые необходимо иметь в двух разных классах. Тогда вам не нужно писать их в обоих классах. Вместо этого вы можете определить это в модуле. А затем включите этот модуль в другие классы. Это обеспечивается Ruby только для обеспечения принципа DRY. Его использовали для СУШИЛЬНОГО кода, чтобы избежать дублирования.
Включить
Когда вы
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