解构 Elixir 中的整数列表后意外的尾部值

Unexpected tail value after destructuring List of integers in Elixir

iex(1)> [foo|bar] = [2,3,4,5,6,7]
[2, 3, 4, 5, 6, 7]
iex(2)> foo
2
iex(3)> bar
[3, 4, 5, 6, 7]
iex(4)> [foo|bar] = [6,7,8]      
[6, 7, 8]
iex(5)> foo
6
iex(6)> bar
'\a\b'

我本以为 bar 最后会是 [7,8],但它的值是 '\a\b'

我是 Elixir 的新手,正在寻找原因的解释。 我是 运行 长生不老药 1.13.3

您的输出实际上是 [7, 8]...它只是 re-formatted。

这可能是 Elixir 中最令人困惑的事情之一,但这是有历史原因的。密切注意您在输出中看到的 单引号 :它们表示 charlist 这是未编码代码点的列表(类似于 old-Erlang 版本的字符串,当时 Erlang 还没有 built-in 支持字符串)。代码点表示 Unicode 字符。当 Elixir 的成员由 ASCII 范围内的整数组成时,Elixir 试图通过将列表格式化为 human-readable 来提供与 Erlang charlists 的一些向后兼容性。您可以将此格式化行为覆盖为 IO.inspect/2:

的选项
iex> IO.inspect([7, 8], charlists: :as_lists)
[7, 8]  # <--- there is your list!
'\a\b'  # <--- here is the attempt at making it human-readable

iex> IO.inspect('cat', charlists: :as_lists)
[99, 97, 116]
'cat'

仅当列表包含 ASCII 范围内的整数时才会出现此行为。当成员不在 ASCII 范围内时,不需要特殊选项来自定义格式,例如

iex> IO.inspect([1001, 1002, 1003])
[1001, 1002, 1003]
[1001, 1002, 1003]