解构 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]
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]