我在Elixir的字符串映射上映射Integer.parse
时遇到了一些非常奇怪的行为。我执行了以下操作:
Enum.map(["7", "8", "9"], &elem(Integer.parse(&1), 0))
这产生了以下输出:'\a\b\t'
。
奇怪的是,如果我改变“7”,它的行为就像我期望的那样:
`Enum.map(["4", "8", "9"], &elem(Integer.parse(&1), 0))`
[4, 8, 9]
进一步的实验表明,对于大于6但小于14
的每个前导数,存在类似的行为例如Enum.map(["11", "8", "10"], &elem(Integer.parse(&1), 0))
会产生'\v\b\n'
但Enum.map(["16", "8", "10"], &elem(Integer.parse(&1), 0))
会产生[16, 8, 10]
对此有何解释?
答案 0 :(得分:3)
问题是Erlang处理整数列表,其中所有元素都映射到可打印的ascii字符作为列表。因此,如果整数列表仅包含可以映射到ascii字符的数字,那么它将被打印为字符序列。 [7, 8, 9]
== '\a\b\t'
返回true
,因为Erlang不区分整数列表和charlist版本。只要整数列表不产生可打印的ASCII,就会看到打印整数列表的行为与[16, 8, 9]
一样。
执行i [7, 8, 9]
会导致对此行为的解释。
答案 1 :(得分:0)
基本上,这是“可打印”的所有内容,默认情况下打印为charlist(带单引号的字符串)。
有些人通常会在列表末尾添加0
来摆脱它,但现在有一个更好的解决方案:
inspect [7, 8, 9], charlists: :as_lists
# "[7, 8, 9]"
inspect [7, 8, 9], charlists: :as_charlists
"'\\a\\b\\t'"
您可以使用inspect/2
了解有关使用h Inspect.Opts
自定义展示的详情。