Elixir:宏内部需要

时间:2017-12-21 20:34:55

标签: elixir

我写了一个宏,我想在其中使用Logger.info,所以我必须要求Logger。这样做的最佳做法是什么?允许客户端单独使用Logger,或使用宏添加并在那里需要Logger。

2 个答案:

答案 0 :(得分:1)

最佳做法是不要突然从您的宏登录。作为宏的用户,我可能不希望我的日志被无关的信息污染。另一方面,选择这种能力可能具有重要意义。也就是说,我会选择参数化的__using__

defmodule My do
  defmacro __using__(opts \\ [log: false]) do
    quote do
      if unquote(opts)[:log], do: require Logger

      defmacro my_log(what) do
        if unquote(opts)[:log] do
          Logger.info(what)
        end 
      end

      ...
    end
  end
end

现在,您可以在需要时安全地调用my_log,如果用户没有明确要求能够通过传递给use的参数进行记录:

use My, log: true

Logger的任何单一跟踪都不会污染生成的代码。

答案 1 :(得分:0)

Logger调用是否需要在宏内?也许宏可以扩展为对模块的函数调用,然后进行日志记录。

如果确实需要从宏扩展中执行日志记录,那么我添加一个__using__宏来要求依赖项和模块。

相关问题