簡體   English   中英

Elixir引用/取消引用和宏行為

[英]Elixir quote/unquote and macros behaviour

我有__using__兩個版本,但是,第一個版本的行為與我預期的不同。 此代碼無法正常工作(實際上,它不會導入任何內容)。

defmodule SomeModule do
  defmacro __using__(opts \\ []) do
    quote do
      opts = unquote(opts)
      if Keyword.has_key?(opts, :my_key) && opts[:my_key] == 3 do
        import MyModuleOne
      else
        import MyModuleTwo
      end
    end
  end
end

這是工作版本,但是,我不喜歡有兩個單獨的quote部分。

defmodule SomeModule do
  defmacro __using__(opts \\ []) do
    if Keyword.has_key?(opts, :my_key) && opts[:my_key] == 3 do
      quote do
        import MyModuleOne
      end
    else
      quote do
        import MyModuleTwo
      end
    end
  end
end

應該如何重寫第一個以使其正常工作?

那是一個棘手的問題! 花了我一段時間找出原因...

在深入探討原因之前,讓我向您保證您的宏完全有效,並且Elixir的工作原理與您所說的完全一樣

我試圖擴展您發布的兩個宏,並得到相同的結果,即正在導入正確的東西。 但是,為什么它不按預期工作?

這就是為什么

重要的是要注意import / 2是詞法的

從文檔import

讓我給你看兩個例子

iex(1)> import Enum, only: [into: 2]
Enum
iex(2)> into [a: 1], %{}
%{a: 1}
iex(3)>

和...

iex(1)> if true do
...(1)>   import Enum, only: [into: 2]
...(1)> end
Enum
iex(2)> into [a: 1], %{}
** (CompileError) iex:2: undefined function into/2

導入僅在您編寫的子句中生效:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM