2017-01-24 6 views
1

Ich fand Erlangs ~p Format-Befehl hilfreich beim Debuggen: es pretty-druckt Daten in ein Formular, das in Erlang Round-tripped zurückgegeben werden kann.Drucken von Daten im Debugging-Kontext

In Elixir kann ich

require Logger 
# ... 
Logger.debug("foo=#{inspect foo} bar=#{inspect bar}") 

und erhalten den Effekt, den ich will, aber die Eingabe von „inspizieren“ überall ist ein Schmerz und manchmal in meinem Code-Basis muss ich Kernel.inspect. Ich möchte lieber, dass es genau das Richtige tat:

require Logger 
# ... 
Logger.debug("foo=#{foo} bar=#{bar}") 

Das funktioniert nicht, weil ich Elixir Vorstellung davon, wie foo und bar in einem UI zu repräsentieren - Atomen und (beide Arten von) Strings Drucken Sie dasselbe, und Karten werfen einen Fehler, anstatt zu drucken.

Kann ich Elixir anweisen, Kernel.inspect als Standardmethode zum Drucken zu verwenden?

Antwort

1

Sortieren ... Die Art und Weise, wie "#{ foo }" funktioniert, ist, dass Elixir das String.Chars-Protokoll und die to_string-Implementierung dieses Protokolls verwendet.

Also, was Sie tun können, ist

defimpl String.Chars, for: TypeOfFoo do 

    def to_string(foo) do 
     inspect(foo) 
    end 

end 

Also, wenn foo ein Struct ist, dass Sie irgendwo definiert haben, können Sie uns das Sie es in definiert haben mit dem Modul hinzufügen. Ich bin nicht sicher Wenn die Standardimplementierungen in der Elixir-Bibliothek für die Standardtypen übersteuerbar sind.

+0

Ich denke, ich möchte String.Chars haben '@ Fallback_to_any' set' true'. Ist es möglich, das zu ändern? –

+0

Nicht ohne deine eigene Version von Elixier zu kompilieren, gibt es gute Gründe, warum dies nicht der Standard ist. –

+0

Ich würde einen Link zu einigen dieser Gründe lieben, wenn Sie einen haben –