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!