我正在尝试获取长度为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 $'
但是当我从最后一个列表中删除一个数字时,它可以再次正常工作,并给出预期的结果
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]
这是预期的行为吗?还是可以解决这个问题,因为我的每个列表都需要对17个数字进行求和。
答案 0 :(得分:6)
您的'Q $'
初始结果是正确的,并且是初学者的常见困惑。从技术上讲,您的结果应该是[81, 32, 36]
。继续,自己在IEx
中进行尝试:
iex> [81, 32, 36]
# => 'Q $'
iex> 'Q $' == [81, 32, 36]
# => true
只是在Elixir中,字符列表看起来非常类似于字符串,并由其中的字符代码点列表表示。关于为什么有时有时将列表打印为字符列表,有时却不将其打印为字符列表的问题,这是因为只有当它们由valid codepoints组成时才这样。
要将结果打印为实际列表而不是字符列表,可以从pass the appropriate options到inspect
:
result = Enum.map(numbers, fn x -> Enum.sum(x) end)
# => 'Q $'
inspect(result, charlists: :as_lists)
# => [81, 32, 36]
您还可以将IEx配置为始终将字符列表打印为列表:
iex> IEx.configure(inspect: [charlists: :as_lists])
# => :ok
iex> 'Q $'
# => [81, 32, 36]
更多读数: