我试图获得17位数的列表数字,然后将其拆分Integer.digits,并得到这些数字的总和.不幸的是我一直在意外行为(我的结果包含一串字母)并且不确定这是一个错误还是个人错误.
下面是iex错误的控制台,结果给出'Q $':
iex(4)> numbers = [
...(4)> [1, 4, 8, 1, 3, 6, 9, 4, 2, 5, 5, 6, 3, 1, 8, 8, 7],
...(4)> [1,5, 9, 4, 1, 3, 2, 7],
...(4)> [1, 5, 4, 6, 5, 7, 8]
...(4)> ]
iex(5)> Enum.map(numbers, fn x -> Enum.sum(x) end)
'Q $'
Run Code Online (Sandbox Code Playgroud)
但是当我从最后一个列表中删除一个数字时,它再次正常工作,并给出预期的结果
iex(1)> numbers = [
...(1)> [1, 4, 8, 1, 3, 6, 9, 4, 2, 5, 5, 6, 3, 1, 8, 8, 7],
...(1)> [1,5, 9, 4, 1, 3, 2, 7],
...(1)> [1, 5, 4, 6, 5, 7]
...(1)> ]
iex(2)> Enum.map(numbers, fn x -> Enum.sum(x) end)
[81, 32, 28]
Run Code Online (Sandbox Code Playgroud)
这是预期的行为吗?或者有一些解决方法,因为我的每个列表需要总计17个单独的数字.
您的初步结果'Q $'是正确的,并且是初学者常见的混淆源.从技术上讲,你的结果应该是[81, 32, 36],而且确实如此.来吧,IEx亲自尝试一下:
iex> [81, 32, 36]
# => 'Q $'
iex> 'Q $' == [81, 32, 36]
# => true
Run Code Online (Sandbox Code Playgroud)
只是在Elixir中,查尔斯主义者看起来非常类似于字符串,并且由其中字符的代码点列表表示.至于为什么有时列表被打印为查询列表,有时不打印,这是因为只有当它们由有效的代码点组成时才会出现.
要将结果打印为实际列表而不是列表,您可以将适当的选项传递给inspect:
result = Enum.map(numbers, fn x -> Enum.sum(x) end)
# => 'Q $'
inspect(result, charlists: :as_lists)
# => [81, 32, 36]
Run Code Online (Sandbox Code Playgroud)
您还可以将IEx配置为始终将列表打印为列表:
iex> IEx.configure(inspect: [charlists: :as_lists])
# => :ok
iex> 'Q $'
# => [81, 32, 36]
Run Code Online (Sandbox Code Playgroud)
进一步阅读: