0
我試圖用注射值,如:使用注射值
quote do
var!(state) = "something"
unquote(block)
do_something_else_with(state)
end
我知道這是邪惡的,但我想這樣做只是爲了好玩。在該塊可能執行或未執行任何操作之後,是否可以訪問該狀態?
我試圖用注射值,如:使用注射值
quote do
var!(state) = "something"
unquote(block)
do_something_else_with(state)
end
我知道這是邪惡的,但我想這樣做只是爲了好玩。在該塊可能執行或未執行任何操作之後,是否可以訪問該狀態?
是的,但塊和do_something_else_with
都需要始終使用var!(state)
,以便宏衛生不會在結果代碼中給state
一個不同的名稱。這裏有一個例子:
defmodule Main do
defmacro with_state(do: block) do
quote do
var!(state) = "something"
IO.inspect {:before, var!(state)}
unquote(block)
IO.inspect {:after, var!(state)}
end
end
def main do
with_state do
IO.inspect {:inside_before, var!(state)}
var!(state) = "else"
IO.inspect {:inside_after, var!(state)}
end
end
end
Main.main
輸出:
{:before, "something"}
{:inside_before, "something"}
{:inside_after, "else"}
{:after, "else"}
非常感謝您! – Haito