Macros Elixir宏-作为变量传递的参数的模式匹配
我试图更好地理解Elixir宏,但我很难找到一个场景,在这个场景中,当我试图传递的值是一个变量时,我可以对传递给宏的参数进行模式匹配。下面是一个简单的例子来说明:Macros Elixir宏-作为变量传递的参数的模式匹配,macros,elixir,Macros,Elixir,我试图更好地理解Elixir宏,但我很难找到一个场景,在这个场景中,当我试图传递的值是一个变量时,我可以对传递给宏的参数进行模式匹配。下面是一个简单的例子来说明: macro\u test.ex defmodule MacroTest do use MacroTest.UseMe def run() do atom = :hello_world macro_a(atom) end end defmodule MacroTest.UseMe do defmac
macro\u test.ex
defmodule MacroTest do
use MacroTest.UseMe
def run() do
atom = :hello_world
macro_a(atom)
end
end
defmodule MacroTest.UseMe do
defmacro __using__(_) do
quote do
defmacro macro_a(:hello_world) do
quote do
"Success!"
end
end
defmacro macro_a(:some_other_atom) do
quote do
"Did something else..."
end
end
end
end
end
使用_me.ex
defmodule MacroTest do
use MacroTest.UseMe
def run() do
atom = :hello_world
macro_a(atom)
end
end
defmodule MacroTest.UseMe do
defmacro __using__(_) do
quote do
defmacro macro_a(:hello_world) do
quote do
"Success!"
end
end
defmacro macro_a(:some_other_atom) do
quote do
"Did something else..."
end
end
end
end
end
当我试图编译这段代码时,我得到了错误
== Compilation error in file lib/macro_test.ex ==
** (FunctionClauseError) no function clause matching in MacroTest.macro_a/1
如果我更改初始的run()
函数,使原子直接传递给宏,例如macro\u a(:hello\u world)
,那么它编译/运行得很好
如何更改此方案,使宏模式能够匹配作为变量提供的值,而不是文字值本身?这取决于您要执行的操作。宏在编译时运行,并对部分源代码进行操作(与所述源代码返回的运行时值相反)。因此,在本例中,宏知道它已被一个名为
atom
的变量调用,但它无法知道该变量已在调用函数的前面被赋值
您可以在运行时检查给定变量的值:
defmacro macro_a(a) do
quote do
case unquote(a) do
:hello_world ->
"Success!"
:some_other_atom ->
"Did something else..."
end
end
end
也就是说,每次调用
宏a
都会被上面的case
表达式替换,使用作为参数传递的任何变量或其他表达式。这取决于您要执行的操作。宏在编译时运行,并对部分源代码进行操作(与所述源代码返回的运行时值相反)。因此,在本例中,宏知道它已被一个名为atom
的变量调用,但它无法知道该变量已在调用函数的前面被赋值
您可以在运行时检查给定变量的值:
defmacro macro_a(a) do
quote do
case unquote(a) do
:hello_world ->
"Success!"
:some_other_atom ->
"Did something else..."
end
end
end
也就是说,每次调用
macro\u a
都会被上面的case
表达式替换,使用任何变量或其他表达式作为参数传递。Ah,非常好的建议。这是我正在开发的应用程序的一个很好的解决方案,非常感谢。啊,非常好的建议。这是我正在开发的应用程序的一个很好的解决方案,非常感谢。