下面的代码没有问题:
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
?
宏引入了卫生。文档摘录:
[…] 保证在引号内定义的变量不会与在扩展该宏的上下文中定义的变量冲突。
Kernel.var!/2
。
defmacro assert_match do
quote do: var!(var_a) = 42
end
[…]
assert_match()
42 = var_a