當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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 \\ [])。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。