当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Elixir Macro.escape用法及代码示例


Elixir语言中 Macro.escape 相关用法介绍如下。

用法:

escape(expr, opts \\ [])
@spec escape(
  term(),
  keyword()
) :: t()

递归地转义一个值,以便将其插入到语法树中。

例子

iex> Macro.escape(:foo)
:foo

iex> Macro.escape({:a, :b, :c})
{:{}, [], [:a, :b, :c]}

iex> Macro.escape({:unquote, [], [1]}, unquote: true)
1

选项

  • :unquote - 当为 true 时,此函数使 unquote/1 unquote_splicing/1 语句未转义,有效地取消对转义内容的引用。此选项仅在转义可能包含引用片段的 AST 时有用。默认为假。

  • :prune_metadata - 如果为真,则从转义的 AST 节点中删除元数据。请注意,此选项会更改转义代码的语义,并且仅应在转义 AST 时使用。默认为假。

    例如, ExUnit 存储每个断言的 AST,因此当断言失败时,我们可以向用户显示代码片段。如果没有这个选项,每次编译测试模块时,我们都会得到模块字节码的不同 MD5,因为 AST 包含特定于编译环境的元数据,例如计数器。通过修剪元数据,我们确保模块是确定性的,并减少 ExUnit 需要保留的数据量。仅保留最少量的元数据,例如 :line:no_parens

Kernel.SpecialForms.quote/2 的比较

escape/2 函数有时会与 Kernel.SpecialForms.quote/2 混淆,因为上述示例对两者的行为相同。当要转义的值存储在变量中时,最能说明关键区别。

iex> Macro.escape({:a, :b, :c})
{:{}, [], [:a, :b, :c]}
iex> quote do: {:a, :b, :c}
{:{}, [], [:a, :b, :c]}

iex> value = {:a, :b, :c}
iex> Macro.escape(value)
{:{}, [], [:a, :b, :c]}

iex> quote do: value
{:value, [], __MODULE__}

iex> value = {:a, :b, :c}
iex> quote do: unquote(value)
{:a, :b, :c}

escape/2 用于转义values(直接传递或变量绑定),而 Kernel.SpecialForms.quote/2 为表达式生成语法树。

相关用法


注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Macro.escape(expr, opts \\ [])。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。