Учебники

Эликсир — псевдонимы

Чтобы упростить повторное использование программного обеспечения, 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, вы можете просто написать —

Live Demo

alias String, as: Str
IO.puts(Str.length("Hello"))

Вышеуказанная программа генерирует следующий результат —

5

Псевдоним дается модулю String как Str . Теперь, когда мы вызываем любую функцию, используя литерал Str, она фактически ссылается на модуль String . Это очень полезно, когда мы используем очень длинные имена модулей и хотим заменить их на более короткие в текущей области.

ПРИМЕЧАНИЕ. — Псевдонимы ДОЛЖНЫ начинаться с заглавной буквы.

Псевдонимы действительны только в той лексической области, в которой они вызываются. Например, если у вас есть 2 модуля в файле и вы создали псевдоним в одном из модулей, этот псевдоним не будет доступен во втором модуле.

Если вы дадите имя встроенному модулю, такому как String или Tuple, в качестве псевдонима для какого-либо другого модуля, чтобы получить доступ к встроенному модулю, вам нужно будет добавить его перед «Elixir». , Например,

Live Demo

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__ вызывается в приведенном выше примере, и код внедряется в наш локальный контекст. Локальный контекст — это то, где макрос использования был вызван во время компиляции.