Elixir embutido (EEx)
Do mesmo jeito que Ruby possui ERB e Java JSPs, Elixir tem EEx ou Embedded Elixir (Elixir embutido). Com EEx podemos embutir e avaliar código Elixir dentro das strings.
API
A API EEX suporta trabalhar com cadeias de caracteres e arquivos diretamente. A API está dividida em três componentes principais: avaliação simples, definições de funções, e compilação para AST.
Avaliação
Usando eval_string/3 e eval_file/2 podemos realizar uma simples avaliação sobre uma string ou conteúdos de um arquivo. Este é a API mais simples mas lento uma vez que o código é interpretado e não compilado.
iex> EEx.eval_string "Hi, <%= name %>", [name: "Sean"]
"Hi, Sean"
Definições
A mais rápida e preferida forma de usar o EEx é embutir nosso template dentro de um módulo assim ele pode ser compilado. Para isso precisamos do nosso template no momento da compilação e dos macros function_from_string/5 e function_from_file/5.
Vamos mover nossa saudação para outro arquivo e gerar uma função para nosso template:
# 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"
Compilação
Por último, EEx fornece-nos uma forma para directamente gerar Elixir AST a partir de uma cadeia de caracteres usando compile_string/2 ou compile_file/2. Esta API é usada principalmente pelas APIs acima mencionadas, mas está disponível caso deseje implementar seu próprio tratamento de Elixir embutido.
Etiquetas
Por padrão, existem quatro etiquetas (tags) suportadas no EEx:
<% expressão Elixir - alinhado com a saída %>
<%= expressão Elixir - substitui com o resultado %>
<%% EEx quotation - retorna o contéudo do seu interior %>
<%# Comentários - são ignorados no código fonte %>
Todas expressões que desejamos imprimir devem usar o sinal de igualdade (=). É importante notar que enquanto outras linguagens de templates tratam cláusulas tipo if de forma especial, EEx não faz isso. Sem = nada será impresso:
<%= if true do %>
A truthful statement
<% else %>
A false statement
<% end %>
Motor
Por padrão Elixir usa EEx.SmartEngine que inclui suporte atribuições (como @name):ike @name):
iex> EEx.eval_string "Hi, <%= @name %>", assigns: [name: "Sean"]
"Hi, Sean"
As atribuições EEx.SmartEngine são úteis porque atribuições podem ser mudadas sem a necessidade de compilar o template:
Interessado em escrever o seu próprio motor? Confira o procedimento EEx.Engine para ver o que é necessário.
Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!