2017-12-21 5 views
0

Ich schrieb ein Makro, und ich möchte Logger.info darin verwenden, also muss ich Logger anfordern. Was ist die beste Vorgehensweise, um dies zu tun? Obligieren Sie den Client, um Logger eigenständig zu benötigen, oder fügen Sie Makro hinzu und fordern Sie Logger dort an.Elixier: benötigt in einem Makro

Antwort

0

Die beste Vorgehensweise wäre nicht aus Ihren Makros plötzlich zu protokollieren. Als Benutzer Ihres Makros möchte ich mein Protokoll möglicherweise nicht mit irrelevanten Informationen belasten. Auf der anderen Seite könnte dies eine wichtige Rolle spielen, um eine solche Möglichkeit zu haben. Das heißt, ich gehen würde, mit einem parametrisierte __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 

Jetzt können Sie sicher my_log rufen bei Bedarf und wenn der Benutzer nicht verlangt ausdrücklich die Möglichkeit, über params zu use weitergegeben zu protokollieren:

use My, log: true 

keine einzige Spur von Logger wird den resultierenden Code verschmutzen.

0

Muss sich der Logger-Aufruf innerhalb des Makros befinden? Vielleicht kann das Makro zu einem Funktionsaufruf zu einem Modul erweitert werden, das dann die Protokollierung durchführt.

Wenn es wirklich notwendig ist, die Protokollierung von der Makroerweiterung durchzuführen, dann würde ich ein __using__ Makro hinzufügen, um Abhängigkeiten und Ihr Modul zu erfordern.

+0

Erweiterung jeder 'Logger' Betrieb zu einem Aufruf einer Funktion ist eine sehr schlechte Idee auf den Punkt gebracht, da es die Idee von [Kompilierung Spülung] Ruinen (https://hexdocs.pm/logger/Logger.html# Modul-Anwendung-Konfiguration). – mudasobwa