之后如何使宏调用的模式匹配变量可用?

问题描述 投票:0回答:1

下面的代码没有问题:

      assert {:ok,
              %{
                "a" => var_a,
                 ......
              } = my_func()
      assert false === is_empty(var_a)

但是我用了自己的宏

assert_match
后,
var_a
就不能用了:

      assert_match({:ok,
              %{
                "a" => var_a,
                 ......
              } = my_func(), "my description")
       assert_equal(false, is_empty(var_a))

我得到错误:

warning: variable "var_a" does not exist ......

为什么变量“var_a”在

assert()
中可用,但在我自己的宏
assert_match
中不可用? 如何使
var_a
可用于我自己的宏
assert_match

macros elixir
1个回答
0
投票

宏引入了卫生。文档摘录:

[…] 保证在引号内定义的变量不会与在扩展该宏的上下文中定义的变量冲突。

要绕过宏卫生,应该在变量上显式调用

Kernel.var!/2

defmacro assert_match do
  quote do: var!(var_a) = 42
end

[…]

assert_match()
42 = var_a
© www.soinside.com 2019 - 2024. All rights reserved.