我写了一个宏,我想在其中使用Logger.info,所以我必须要求Logger。这样做的最佳做法是什么?允许客户端单独使用Logger,或使用宏添加并在那里需要Logger。
答案 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__
宏来要求依赖项和模块。