elixir - 如何在Elixir中打印出 map 的数组值?

标签 elixir

Ruby的Elixir的新手,我正在尝试使用以下代码打印出 map 的数组值:

map-script.ex

list = [0, 1]
map = %{0 => [1, 2], 1 => [2, 3]}

Enum.each list, fn n ->
  IO.puts map[n]
end

输出:
^A^B
^B^C

我究竟做错了什么? Elixir看起来与Ruby类似,但行为有所不同。

最佳答案

您应该使用IO.inspect而不是IO.puts来打印值的内部表示形式:

iex> IO.puts [1, 2]
^A^B                          # prints "^A^B"
:ok                           # return value of IO.puts

iex> IO.inspect [1, 2]
[1, 2]                        # prints "[1, 2]"
[1, 2]                        # return value of IO.inspect

但是,您可能仍然会遇到一些特殊值的问题:
iex> IO.inspect [97, 98]
'ab'                          # prints "'ab'"
'ab'                          # return value of IO.inspect

要解释此行为,我们需要了解字符串如何在Elixir中工作。有两种字符串。二进制字符串(双引号)和字符列表(单引号)。在内部,这些是从更简单的基元构建的。二进制字符串是从二进制文件构建的,而字符列表是从列表构建的:
iex> "ab"                    # a binary string
"ab"

iex> <<97, 98>>              # the same string in binary syntax
"ab"

iex> 'ab'                    # a character list
'ab'

iex> [97, 98]                # the same character list in list syntax
'ab'

乍一看似乎令人困惑,但这是由于两件事而发生的。首先,没有内置的字符串类型,因为我们已经看到字符串是从其他原始类型构建的。其次,Elixir中没有用户定义的类型。因此,当Elixir看到仅包含整数的列表时,为了方便起见,它将尝试将其打印为字符串。但是,实际上,它仍然只是整数列表。

在上面的示例中,9798代表字符ab的unicode代码点,因此即使使用IO.inspect,它们也将显示为字符串。

现在您可以在示例中看到为什么打印^A^B了-这些只是control characters from the ASCII encoding,碰巧由代码点12表示。

但是,您可以传递选项char_lists: :as_lists来打印原始列表,而无需尝试进行这种转换:
iex> IO.inspect [97, 98], char_lists: :as_lists
[97, 98]                                         # prints '[97, 98]'
'ab'                                             # Iex still shows the return value as 'ab'

如果打开iex并键入h Inspect.Opts,您将看到Elixir还会使用其他值(特别是结构和二进制文件)来执行此类操作。

关于elixir - 如何在Elixir中打印出 map 的数组值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32804904/

相关文章:

elixir - 相当于 IO.inspect 函数,只返回字符串而不是打印给定的列表、映射或关键字列表?

ruby - 使用功能样式匹配流中任意数量的以下标记

elixir - 在 Phoenix 中使用重定向时如何发送参数

elixir - 如何在现有表 Phoenix 中添加字段

elixir - 能够将操作推送到消息队列进行处理

elixir - 列表包含另一个顺序相同的列表

elixir ecto naive_datetime 转换错误

elixir - 在 Phoenix Framework 中截断文本

web - Phoenix 日志中的奇怪错误 : running MyApp. 端点已终止

functional-programming - 在 Elixir 中编写函数 "once"