EEx
EEX
EEx代表Embedded Elixir。它允许您以可靠的方式在字符串中嵌入Elixir代码。
iex> EEx.eval_string "foo <%= bar %>", [bar: "baz"]
"foo baz"
API
该模块提供了3个主要API供您使用:
- 直接评估一个字符串(
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"