为什么字符列表不会显示为列表?

Ale*_*oba 0 elixir

我正在尝试使用该Enum.map函数迭代一个字符列表,但它的行为与我期望的行为不同。

第一行不将字符列表视为字符列表,在第二行中我不明白为什么修改匿名函数会这样做。

iex(32)> Enum.map('ABCD',fn(char)->char end)  
'ABCD'
iex(33)> Enum.map('ABCD',fn(char)->[char] end)
['A', 'B', 'C', 'D']
Run Code Online (Sandbox Code Playgroud)

我期待第一行返回['A','B','C','D'],第二行返回[['A'],['B'],['C'],['D']]。为什么不是这种情况?

Vir*_*iil 5

在 Elixir 中,不仅(例如 C 也)char 是一个数字,它表示一个“字符”的 ASCII 码。此外,'括号代表一个列表,而"代表二进制文件(或字符串)。

所以,这段代码可能会帮助你理解发生了什么:

iex> is_list('ABCD')
true # it's list - as described    
iex> is_binary('ABCD')
false # it's list of chars - not a string
iex> is_binary("ABCD")
true # with " brackets it's a string
iex> is_list('A')
true # Of cource this is list - list with one element. Like [65]
iex> [65]
'A' # Unexpected? As I told - char is a simple integer!
iex> [65, 66, 67, 68]
'ABCD' # Absolutely logical from previous line
iex> ?A
65 # We use ? sign to get "char" from "letter"
iex> [?A | 'BCD']
'ABCD' # List append works as expected
iex> [?A | [66, 67, 68]]
'ABCD' # The same - absolutely
iex> Enum.map('ABCD',fn(char)->char end)  
'ABCD' # char "variable" here is 65, 66, 67, 68 -> maps into list [65, 66, 67, 68]
iex> Enum.map('ABCD',fn(char)->[char] end)
['A', 'B', 'C', 'D'] # You've got list of lists here. Quite crazy?
iex> [[65], [66], [67], [68]]
['A', 'B', 'C', 'D'] # This is your list
Run Code Online (Sandbox Code Playgroud)