我刚刚开始使用Elixir。我正在使用ExUnit编写一些测试,用于我自己实现的简单的Enumerable函数,而不使用标准的Enum模块。
在我的测试中,我发现每当我引用列表[7, 8, 9]
时,一旦在stdout中打印它,我就会看到char列表'\a\b\t'
。为什么会发生这种事?
答案 0 :(得分:71)
当您使用inspect
和IO.inspect
等函数时,Elixir会尝试智能并将整数列表格式化为字符串以便于阅读。但是,在某些情况下,您最终会得到一个无意义的字符串,因为列表中的所有整数都恰好是有效的代码点。例如,字符A到Z用ASCII表示为整数65到90.
iex> IO.inspect [65, 66, 67]
'ABC'
如果您想打印原始列表,可以使用charlists: :as_lists
选项。有关选项的完整列表,请点击iex
并输入h Inspect.Opts
。
iex> IO.inspect [65, 66, 67], charlists: :as_lists
[65, 66, 67]
使用Elixir< 1.4,您可以使用char_lists: false
。
顺便说一下,这不是Elixir隐藏你的底层构建块的唯一情况,它也发生在二进制文件(双引号字符串)和结构上。
更深层次的原因是Elixir和Erlang没有用户定义的类型,因此无法区分列表和单个带引号的字符串,因为两者都只是列表。但是,这在其他情况下也可以成为一种优势。例如,它允许我们简单地序列化Elixir和Erlang中的任何数据结构,因为它只能从该语言附带的基本构建块构建。
答案 1 :(得分:6)
虽然@Patrick的回答绝对正确,但您也可以将IEx
配置为始终将charlists
显示为常规列表,而不是每次手动调用inspect
:
iex> IEx.configure(inspect: [charlists: :as_lists])
# => :ok
iex> [65, 66, 67]
# => [65, 66, 67]
iex> 'ABC'
# => [65, 66, 67]
答案 2 :(得分:0)
要为您的环境禁用此行为,请create a ~/.iex.exs
file 始终应用配置:
# .iex.exs
IEx.configure(inspect: [charlists: :as_lists])
这样就无需每次都提供 inspect
选项或手动运行 IEx.configure
。
如果您想覆盖特定项目的全局设置,您也可以使用 separate .iex
scripts per directory。