Какая разница между use
а import
?
use - это простой механизм использования данного модуля в текущем контексте
https://hexdocs.pm/elixir/Kernel.SpecialForms.html#import/2
Импортирует функции и макросы из других модулей
Похоже, одно различие заключается в import
том, что вы можете выбрать конкретные функции / макросы, а use
вводить все.
Есть ли другие различия? Когда бы вы использовали один поверх другого?
import Module
вводит функции, которые будут использоваться внутри вашего модуля.use Module
вводит функции для использования И публикует их в вашем модулеОтветы:
import Module
переносит все функции и макросыModule
un-namespace в ваш модуль.require Module
позволяет использовать макросы,Module
но не импортирует их. (ФункцииModule
всегда доступны в пространстве имен.)use Module
первыйrequires
модуль, а затем вызывает__using__
макросModule
.Учтите следующее:
Это не скомпилируется, так как
ModA.moda()
не было импортировано вModB
.Однако будет компилироваться следующее:
Как и когда вы
use
сделали,ModA
он сгенерировалimport
оператор, который был вставлен вModB
.источник
*.ex
файлами иdefmodule
блоками, и как вы извлекаете модуль из файла в реплику IEX__using__
метод выполняется наuse ModA
? Вероятно, имеет смысл просто использовать импорт вModB
приведенном вами примере, правильно?use
предназначен для внедрения кода в текущий модуль, в то времяimport
как используется для импорта функций для использования. Вы можете создатьuse
реализацию, которая, например, автоматически импортирует функции, как я делаю с Timex, когда вы добавляетеuse Timex
в модуль, взгляните на timex.ex, если вы хотите знать, что я имею в виду , это очень простой пример того, как создать модуль , который может бытьuse
«дисточник
use
это более общий, чемimport
? То есть функциональностьimport
является подмножествомuse
import
по - прежнему необходимо, так как я не знаю , если это правильно сказать , что вы можете переопределитьimport
с вuse
одиночку, но я не удивлюсь , если это возможно.use
хотя и абсолютно более мощный. Вы можете делать с ним очень сложные вещи, например, я активно использую егоuse
в своемexprotobuf
проекте, который вы можете проверить, если хотите, чтобы он был доведен до предела. Вы можете расширять модули с помощью кода, выполнять код во время компиляции, добавлять функции в модуль и т. Д. В основном он сочетает в себеimport
и возможности макросов.use
). Его почти наверняка будет легче читать для новичкаexprotobuf
, но я думаю, что я, вероятно, достигнуuse
этого предела,exprotobuf
поэтому может быть полезно просто посмотреть, как далеко вы можете зайти.use
на самом деле мало что делает, просто вызывает__using__
указанный модуль.Смотрите страницу «alias, require and import» в официальном руководстве по началу работы с elixir:
требовать
Эликсир предоставляет макросы как механизм для метапрограммирования (написания кода, генерирующего код).
Макросы - это фрагменты кода, которые выполняются и раскрываются во время компиляции. Это означает, что для использования макроса мы должны гарантировать, что его модуль и реализация доступны во время компиляции. Это делается с помощью
require
директивы.Как правило, модуль не требуется перед использованием, за исключением случаев, когда мы хотим использовать макросы, доступные в этом модуле.
Импортировать
Мы используем,
import
когда хотим легко получить доступ к функциям или макросам из других модулей без использования полного имени. Например, если мы хотим использоватьduplicate/2
функцию изList
модуля несколько раз, мы можем импортировать ее:В этом случае мы импортируем только функцию
duplicate
(с арностью 2) изList
.Обратите внимание, что
import
модуль автоматическиrequire
делает это.использование
Хотя это и не директива,
use
это макрос, который тесно связан с тем,require
что позволяет вам использовать модуль в текущем контексте.use
Макро часто используются разработчиками , чтобы принести внешнюю функциональность в текущую лексическую область, часто модули.За кулисами
use
требует данный модуль, а затем вызывает__using__/1
обратный вызов на нем, позволяя модулю ввести некоторый код в текущий контекст. Вообще говоря, следующий модуль:составлен в
источник
Имея опыт работы с языками Python / Java / Golang,
import
vsuse
тоже меня смутил. Это объяснит механизм повторного использования кода на некоторых примерах декларативных языков.Импортировать
Короче говоря, в Elixir вам не нужно импортировать модули. Доступ ко всем публичным функциям можно получить с помощью полного синтаксиса MODULE.FUNCTION:
В Python / Java / Golang вам необходимо,
import MODULE
прежде чем вы сможете использовать функции в этом МОДУЛЕ, например PythonТогда то, что
import
делает в Elixir, может вас удивить:https://elixir-lang.org/getting-started/alias-require-and-import.html#import
Так что, если вы хотите печатать
sqrt
вместоInteger.sqrt
,trim
вместоString.trim
,import
поможетЭто может вызвать проблемы с чтением кода и при конфликте имен, поэтому это не рекомендуется в Erlang (языке, который влияет на Elixir). Но в Elixir такого соглашения нет, вы можете использовать его на свой страх и риск.
В Python такой же эффект может быть достигнут:
и его рекомендуется использовать только в некоторых специальных сценариях / интерактивном режиме - для более короткого / быстрого набора текста.
использовать и требовать
Что отличает
use
/require
отличает то, что они относятся к «макросу» - концепции, которая не существует в семействе Python / Java / Golang ....Вам не нужен
import
модуль для использования его функций, но вам нуженrequire
модуль, чтобы использовать его макросы :Хотя это
is_even
может быть написано как обычная функция, это макрос, потому что:https://elixir-lang.org/getting-started/alias-require-and-import.html#require
use
, к выдержке из документа Elixir:составлен в
https://elixir-lang.org/getting-started/alias-require-and-import.html#use
Так что писать то
use X
же, что писатьuse/2
это макрос , макрос преобразует код в другой код за вас.Вам захочется,
use MODULE
когда вы:require
)MODULE.__using__()
Проверено на Elixir 1.5
источник
use Module
требуетModule
и также призывает__using__
к этому.import Module
привноситModule
функциональность в текущий контекст , а не просто требует ее.источник
Импортировать
Делает все функции и макросы из данного модуля доступными внутри лексической области, в которой он вызывается. Имейте в виду, что в большинстве случаев вам нужно импортировать только одну или несколько функций / макросов.
Пример:
использование
Этот макрос позволяет вам внедрить любой код в текущий модуль. Вы должны быть осторожны при использовании внешних библиотек с
use
, поскольку вы можете не знать , что именно происходит за кулисами.Пример:
Код сцены внутри
__using__
был вставлен вTextPrinter
модуль.Кстати, в Elixir больше инструкций по работе с зависимостями .
источник