Embedded Elixir (EEx)
По аналогии с ERB в Ruby и JSP в Java, в Elixir есть EEx или Embedded Elixir (“встраиваемый” Elixir код). С помощью EEx мы можем встраивать и интерпретировать код Elixir внутри любого другого текста.
API
API EEx позволяет напрямую работать как со строками, так и с файлами. API разделено на три основных компонента: простая интерпретация, определение функций и компиляция в AST (Абстрактное синтаксическое дерево).
Интерпретация
Используя функции eval_string/3
и eval_file/3
, мы можем выполнить интерпретацию кода, содержащегося в строке или файле. Это самые простые функции в API, но и самые медленные, т.к. код каждый раз интерпретируется снова, а не компилируется заранее.
iex> EEx.eval_string "Hi, <%= name %>", [name: "Sean"]
"Hi, Sean"
Определение функций
Более производительный и предпочтительный способ использования EEx — это создание функции из нашего шаблона с кодом, определив её внутри модуля, который будет скомпилирован. Для этого мы должны подготовить шаблон до начала компиляции и использовать макросы function_from_string/5
или function_from_file/5
.
Давайте разместим код нашего приветствия в отдельном файле и сгенерируем функцию greeting
из нашего шаблона:
# greeting.eex
Hi, <%= name %>
defmodule Example do
require EEx
EEx.function_from_file(:def, :greeting, "greeting.eex", [:name])
end
iex> Example.greeting("Sean")
"Hi, Sean"
Компиляция
И напоследок EEx даёт нам возможность напрямую генерировать абстрактное синтаксическое дерево Elixir из строки или файла с помощью функций compile_string/2
и compile_file/2
. Хотя эти функции обычно используются внутри приведённых выше, они доступны вам на тот случай, если вы захотите реализовать собственную обработку встраиваемого Elixir кода.
Теги
По умолчанию в шаблонах EEx поддерживаются четыре тега:
<% выражение Elixir - выполнить код выражения %>
<%= выражение Elixir - заменить результатом вычисления выражения %>
<%% EEx цитирование - возвращает текст внутри тега %>
<%# комментарии - комментарии игнорируются %>
Все выражения, результат вычисления которых вы хотите увидеть в тексте, должны использовать знак равенства (=
). Стоит заметить — другие языки шаблонов трактуют условные выражения, такие как if
, особым образом, в EEx это не так. Без =
ничего не отобразится в результирующем тексте:
<%= if true do %>
A truthful statement
<% else %>
A false statement
<% end %>
Интерпретатор
По умолчанию Elixir использует интерпретатор EEx.SmartEngine
, который включает поддержку присваиваний (таких, как @name
):
iex> EEx.eval_string "Hi, <%= @name %>", assigns: [name: "Sean"]
"Hi, Sean"
Присваивания в интерпретаторе EEx.SmartEngine
полезны, потому что присваиваемые значения можно изменять без необходимости перекомпиляции шаблона.
Заинтересованы в написании собственного интерпретатора? Всё, что для этого необходимо, вы можете почерпнуть из документации по EEx.Engine
.
Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!