在调试上下文中打印数据

时间:2017-01-24 19:03:55

标签: elixir

我发现Erlang的~p格式命令在调试时很有用:它可以将数据打印成一个可以往返Erlang的表单。

在Elixir,我可以

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

并获得我想要的效果,但在任何地方输入“inspect”都很痛苦,有时在我的代码库中我必须Kernel.inspect。我宁愿说它做的也是正确的:

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

这不起作用,因为我得到了Elixir关于如何在UI中表示foobar的概念 - 原子和(两种)字符串打印相同,并且映射抛出错误而不是打印。

我可以告诉Elixir使用Kernel.inspect作为打印东西的默认方式吗?

1 个答案:

答案 0 :(得分:1)

排序...... "#{ foo }"的工作方式是Elixir使用String.Chars协议和该协议的to_string实现。

所以,你可以做的是

defimpl String.Chars, for: TypeOfFoo do

   def to_string(foo) do
      inspect( foo)
   end

end

因此,如果foo是您在某处定义的结构,则可以将其添加到您已定义的模块中。我不确定Elixir库中的默认实现是否为标准类型是可以覆盖的..