非常教程

Elixir 1.5参考手册

EEx

EEx

EEx代表Embedded Elixir。它允许您以可靠的方式在字符串中嵌入Elixir代码。

iex> EEx.eval_string "foo <%= bar %>", [bar: "baz"]
"foo baz"

API

该模块提供了3个主要API供您使用:

  1. 直接评估一个字符串(eval_string)或一个文件(eval_file)。这是最简单的API,但也是最慢的,因为代码已经过评估,而且之前没有编译过。

2. 从一个字符串(function_from_string)或一个文件(function_from_file)定义一个函数。这使您可以将模板作为函数嵌入模块中,然后将其编译。如果您可以在编译时访问该模板,那么这是首选的API。

3。 将一个字符串(compile_string)或一个文件(compile_file)编译到Elixir语法树中。这是上述两个函数使用的API,如果您想提供自己的方式来处理编译的模板,则可以使用该API。此模块中的所有函数均接受与EEx相关的选项。他们是:

4. :line - 要用作模板开始的行。默认为1。

5. :file - 要在模板中使用的文件。默认为从模板读取的给定文件或从字符串编译时的“nofile”。

6. :engine-用于汇编的EEX引擎。

7. :trim - 修剪引号标签左/右的空白

发动机

EEX有引擎的概念,它允许您修改或转换从给定的字符串或文件中提取的代码。

默认情况下,EEx使用EEx.SmartEngine在简单之上提供一些便利的方法EEx.Engine

标签

EEx.SmartEngine支持以下标记:

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

所有向模板输出内容的表达式都必须使用等号(=)。由于Elixir中的所有内容都是表达式,因此这条规则没有例外。例如,虽然某些模板语言会使用特例if/2子句,但它们在EEx中的处理方式相同,并且还需要=打印它们的结果:

<%= if true do %>
  It is obviously true
<% else %>
  This will never appear
<% end %>

注意,不同的引擎对每个标记可能有不同的规则。其他标记可能会添加到未来的版本中。

EEx.SmartEngine也为您的模板添加了一些宏。一个示例是@允许在模板中轻松访问数据的宏:

iex> EEx.eval_string "<%= @foo %>", assigns: [foo: 1]
"1"

换句话说,<%= @foo %>转化为:

<%= {:ok, v} = Access.fetch(assigns, :foo); v %>

如果assigns在编译时未指定模板所需的变量数,则扩展很有用。

函数

compile_file(filename, options \ [])

获取filename并生成可由Elixir评估或编译为函数的引用表达式

compile_string(source, options \ [])

获取一个字符串source并生成一个可以通过Elixir进行评估或编译为函数的带引号的表达式

eval_file(filename, bindings \ [], options \ [])

获取filename并使用bindings

eval_string(source, bindings \ [], options \ [])

获取字符串。source并使用bindings

function_from_file(kind, name, file, args \ [], options \ [])

从文件内容生成函数定义。

function_from_string(kind, name, source, args \ [], options \ [])

从字符串生成函数定义。

compile_file(filename, options \ [])

compile_file(String.t, keyword) :: Macro.t | no_return

获取filename并生成一个引用表达式,该表达式可以由Elixir计算,也可以编译为一个函数。

compile_string(source, options \ [])

compile_string(String.t, keyword) :: Macro.t | no_return

获取字符串。source并生成一个引用表达式,该表达式可以由Elixir计算,也可以编译为一个函数。

eval_file(filename, bindings \ [], options \ [])

eval_file(String.t, keyword, keyword) :: any

filename使用bindings。获取并评估值。

实例

# sample.eex
foo <%= bar %>

# iex
EEx.eval_file "sample.eex", [bar: "baz"] #=> "foo baz"

eval_string(source, bindings \ [], options \ [])

eval_string(String.t, keyword, keyword) :: any

获取字符串。source并使用bindings...

实例

iex> EEx.eval_string "foo <%= bar %>", [bar: "baz"]
"foo baz"

function_from_file(kind, name, file, args \ [], options \ []) (macro)

从文件内容生成函数定义。

必须给出种类(:def:defp),函数名称,参数和编译选项。

如果您有模板,但是您希望在模块内预编译以加快速度,此函数非常有用。

实例

# sample.eex
<%= a + b %>

# sample.ex
defmodule Sample do
  require EEx
  EEx.function_from_file :def, :sample, "sample.eex", [:a, :b]
end

# iex
Sample.sample(1, 2) #=> "3"

function_from_string(kind, name, source, args \ [], options \ []) (macro)

从字符串生成函数定义。

必须给出种类(:def:defp),函数名称,参数和编译选项。

实例

iex> defmodule Sample do
...>   require EEx
...>   EEx.function_from_string :def, :sample, "<%= a + b %>", [:a, :b]
...> end
iex> Sample.sample(1, 2)
"3"
EEx
EEx 详细
EEx.Engine 详细
EEx.SmartEngine 详细