Elixir:宏内部需要

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

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

elixir
2个回答
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的params登录的能力:

use My, log: true

没有单一的Logger痕迹会污染最终的代码。


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.