Elixir使用var!宏读取调用者作用域变量编译失败如何解决?
问题根因
- 你代码中
def get_my_var内部的var!(my_var)默认只会查找当前def函数作用域内的变量,不会穿透到调用宏的模块顶层作用域。 - 模块顶层定义的
my_var = "happy"是编译期变量,而get_my_var是运行期执行的函数,二者生命周期不匹配,直接引用无法生效。
修复方案
你可以在宏展开阶段直接捕获调用者上下文的变量值,注入到生成的函数体中,修改后代码如下:
defmodule MyUnhygienicMacros do defmacro create_get_function do quote bind_quoted: [my_var: var!(my_var)] do def get_my_var, do: unquote(my_var) end end end defmodule Caller do require MyUnhygienicMacros my_var = "happy" MyUnhygienicMacros.create_get_function() end
验证结果
在iex中执行即可得到预期输出:
iex> Caller.get_my_var() "happy"
内容的提问来源于stack exchange,提问作者Jonathan Chukinas
相关产品推荐
相关产品推荐

