Do you want to pick up from where you left of?
Take me there

嵌入式 Elixir (EEx)

就像 Ruby 有 ERB 而 Java 有 JSP 一樣,Elixir 有 EEx,或稱為嵌入式 (Embedded) Elixir。通過 EEx,可以嵌入 Elixir 內部字串並求值。

Table of Contents

API

EEx API 支援直接處理字串和檔案。API 分為三個主要部分:簡單求值、函數定義和編譯為 AST。

求值 (Evaluation)

使用 eval_string/3eval_file/2 ,可以對字串或檔案內文進行簡單求值。這是最簡單的 API,但是由於程式碼是經過求值和未編譯的,因此速度最慢。

iex> EEx.eval_string "Hi, <%= name %>", [name: "Sean"]
"Hi, Sean"

定義 (Definitions)

使用 EEx 最快且首選的方法是將模板 (template) 嵌入到模組中,以能編譯它。為此,需要在編譯時使用模板,以及 function_from_string/5function_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"

編譯 (Compilation)

最後,EEx 提供了一種經由使用 compile_string/2compile_file/2 從字串或檔案直接生成 Elixir AST 的方法。該 API 主要用於上述所說的 API,但如果希望實現自己對嵌入式 Elixir 的處理,該 API 也可使用。

標籤 (Tags)

預設情況下,EEx 中有四個支援的 Tag:

<% Elixir expression - inline with output %>
<%= Elixir expression - replace with result %>
<%% EEx quotation - returns the contents inside %>
<%# Comments - they are discarded from source %>

所有希望被輸出的表達式 必須 使用等號 (=)。要注意的重點是,雖然其他模板語言 (templating language) 以特殊方式處理像 if 這樣的子句,但 EEx 沒有。沒有 = 什麼都不會輸出:

<%= if true do %>
  A truthful statement
<% else %>
  A false statement
<% end %>

程式引擎 (Engine)

預設情況下,Elixir 使用 EEx.SmartEngine,其中包括對指派 (assignments) 的支援( 如@name ):

iex> EEx.eval_string "Hi, <%= @name %>", assigns: [name: "Sean"]
"Hi, Sean"

EEx.SmartEngine 指派很有用,因為可以在不請求模板編譯的情況下更改指派 (assignments)。

有興趣編寫自己的程式引擎? 請查看 EEx.Engine 行為以了解需要什麼。

Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!