【问题标题】:How to print out a map's array values in Elixir?如何在 Elixir 中打印出地图的数组值?
【发布时间】:2015-12-24 15:03:38
【问题描述】:

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

ma​​p-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 相似,但行为不同....

【问题讨论】:

  • 假设因为 Elixir 看起来像 Ruby,它的行为也会像 Ruby,这是一个很大的错误。

标签: elixir


【解决方案1】:

您应该使用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 也对其他值执行这种操作,特别是结构和二进制文件。

【讨论】:

  • @patrick-oscity 很好的答案.. 真的清楚了事情是如何实现的。但是我想问一下,为什么没有内置的 String 类型..他们是要实现它还是只是长生不老药的方式...?
  • @VoidZero 它是深埋在 erlang VM 内部的东西,所以它可能不会改变。也就是说,二进制字符串工作得很好,所以基本上不需要不同的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 2020-04-18
  • 1970-01-01
  • 2016-07-20
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多