我发现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中表示foo
和bar
的概念 - 原子和(两种)字符串打印相同,并且映射抛出错误而不是打印。
我可以告诉Elixir使用Kernel.inspect作为打印东西的默认方式吗?
答案 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库中的默认实现是否为标准类型是可以覆盖的..