Чтобы упростить повторное использование программного обеспечения, Elixir предоставляет три директивы — псевдоним, require и import . Он также предоставляет макрос с именем use, который кратко изложен ниже —
# Alias the module so it can be called as Bar instead of Foo.Bar alias Foo.Bar, as: Bar # Ensure the module is compiled and available (usually for macros) require Foo # Import functions from Foo so they can be called without the `Foo.` prefix import Foo # Invokes the custom code defined in Foo as an extension point use Foo
Давайте теперь разберемся подробно в каждой директиве.
псевдоним
Директива псевдонимов позволяет вам устанавливать псевдонимы для любого данного имени модуля. Например, если вы хотите дать псевдоним ‘Str’ модулю String, вы можете просто написать —
alias String, as: Str IO.puts(Str.length("Hello"))
Вышеуказанная программа генерирует следующий результат —
5
Псевдоним дается модулю String как Str . Теперь, когда мы вызываем любую функцию, используя литерал Str, она фактически ссылается на модуль String . Это очень полезно, когда мы используем очень длинные имена модулей и хотим заменить их на более короткие в текущей области.
ПРИМЕЧАНИЕ. — Псевдонимы ДОЛЖНЫ начинаться с заглавной буквы.
Псевдонимы действительны только в той лексической области, в которой они вызываются. Например, если у вас есть 2 модуля в файле и вы создали псевдоним в одном из модулей, этот псевдоним не будет доступен во втором модуле.
Если вы дадите имя встроенному модулю, такому как String или Tuple, в качестве псевдонима для какого-либо другого модуля, чтобы получить доступ к встроенному модулю, вам нужно будет добавить его перед «Elixir». , Например,
alias List, as: String #Now when we use String we are actually using List. #To use the string module: IO.puts(Elixir.String.length("Hello"))
Когда вышеуказанная программа запускается, она генерирует следующий результат —
5
требовать
Elixir предоставляет макросы как механизм метапрограммирования (написания кода, генерирующего код).
Макросы — это фрагменты кода, которые выполняются и раскрываются во время компиляции. Это означает, что для использования макроса мы должны гарантировать, что его модуль и реализация доступны во время компиляции. Это делается с помощью директивы require .
Integer.is_odd(3)
Когда вышеуказанная программа запущена, она выдаст следующий результат:
** (CompileError) iex:1: you must require Integer before invoking the macro Integer.is_odd/1
В Elixir Integer.is_odd определяется как макрос . Этот макрос можно использовать как охрану. Это означает, что для вызова Integer.is_odd нам понадобится модуль Integer.
Используйте функцию Integer require и запустите программу, как показано ниже.
require Integer Integer.is_odd(3)
На этот раз программа запустится и выдаст вывод: true .
Как правило, модуль не требуется перед использованием, кроме случаев, когда мы хотим использовать макросы, доступные в этом модуле. Попытка вызова макроса, который не был загружен, вызовет ошибку. Обратите внимание, что, как и директива alias, require также имеет лексическую область . Подробнее о макросах мы поговорим в следующей главе.
Импортировать
Мы используем директиву import для легкого доступа к функциям или макросам из других модулей без использования полного имени. Например, если мы хотим использовать функцию дублирования из модуля List несколько раз, мы можем просто импортировать ее.
import List, only: [duplicate: 2]
В этом случае мы импортируем только дубликат функции (с длиной списка аргументов 2) из списка. Хотя : only является необязательным, его использование рекомендуется во избежание импорта всех функций данного модуля в пространство имен. : Кроме того, можно также указать в качестве опции, чтобы импортировать все в модуле, кроме списка функций.
Директива import также поддерживает : макросы и : функции, которые должны быть переданы : only . Например, чтобы импортировать все макросы, пользователь может написать:
import Integer, only: :macros
Обратите внимание, что импорт тоже ограничен Lexical, как директивы require и alias. Также обратите внимание, что для «импорта» модуля также «требуется» .
использование
Хотя это и не директива, use — это макрос, тесно связанный с require, который позволяет вам использовать модуль в текущем контексте. Макрос использования часто используется разработчиками для внесения внешней функциональности в текущую лексическую область, часто это модули. Давайте разберемся с директивой использования на примере —
defmodule Example do use Feature, option: :value end
Use — это макрос, который преобразует вышеперечисленное в —
defmodule Example do require Feature Feature.__using__(option: :value) end
Для использования модуля сначала требуется модуль, а затем вызывается макрос __using__ для модуля. Elixir обладает большими возможностями метапрограммирования и имеет макросы для генерации кода во время компиляции. Макрос _ _using__ вызывается в приведенном выше примере, и код внедряется в наш локальный контекст. Локальный контекст — это то, где макрос использования был вызван во время компиляции.