在Elixir中使用Integer.parse进行映射时的奇怪行为

时间:2017-08-16 23:39:42

标签: elixir

我在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]

对此有何解释?

2 个答案:

答案 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自定义展示的详情。