Elixir列表被解释为char列表

时间:2015-05-04 19:00:16

标签: list elixir

我刚刚开始使用Elixir。我正在使用ExUnit编写一些测试,用于我自己实现的简单的Enumerable函数,而不使用标准的Enum模块。

在我的测试中,我发现每当我引用列表[7, 8, 9]时,一旦在stdout中打印它,我就会看到char列表'\a\b\t'。为什么会发生这种事?

3 个答案:

答案 0 :(得分:71)

<\ n> Elixir有两种字符串:二进制文件(双引号)和字符列表(单引号)。后一种变体继承自Erlang,并在内部表示为整数列表,映射到字符串的代码点。

当您使用inspectIO.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&lt; 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]

这里是full list of supported options

答案 2 :(得分:0)

要为您的环境禁用此行为,请create a ~/.iex.exs file 始终应用配置:

# .iex.exs
IEx.configure(inspect: [charlists: :as_lists])

这样就无需每次都提供 inspect 选项或手动运行 IEx.configure

如果您想覆盖特定项目的全局设置,您也可以使用 separate .iex scripts per directory