[英]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.