当我 运行 这个函数时,为什么我的 iex return 是 '-C' 或 '-A'

Why does my iex return a '-C' or a '-A' when I run this function

我学习 Elixir 已经有一段时间了,但今天我遇到了一些让我完全困惑的事情。

我做了这个过滤功能:

thingy = for a <- ["may", "lay", "45", "67", "bay", "34"], do: Integer.parse(a)
for {n, _} <- thingy, do: n

output: '-C"'

完全出乎意料的输出,但是版本低于'works'

parseds = for i <- [ "10", "hot dogs", "20" ], do: Integer.parse(i)
for {n, _} <- parseds, do: n

output: [10, 20]

但是,如果我将数字更改为 45 和 65 之类的值,我会得到 '-A' 作为结果。

这只是允许我使用我喜欢的数字的底层二进制函数吗?

这是因为Elixir, like Erlang, doesn't internally have a String type. Single-quoted strings are represented as character lists, and these are commonly used when dealing with Erlang libraries. When you give Elixir the list [45, 67, 34], it displays it as a list of ASCII characters 46, 67, and 34;分别是 -C"

如果列表中至少有一个数字不代表可打印字符,您会看到数字列表。因为 10 没有映射到可打印字符,所以在第二个示例中,您会看到 1020.

请务必注意,您创建的列表在内部仍表示为 [45, 67, 34],因此您执行的任何列表操作都将完全按照您对数字的预期进行。

This is because Elixir, like Erlang, doesn't internally have a String type

不管那是什么意思。字符串,Smings。就这么简单:

iex(4)> [45, 67, 34]
'-C"'

在 iex 中,数字列表被解释为字符序列,其中每个数字都是某个字符的数字代码。如果您查看 ascii chart,您会看到:

45 -> -
67 -> C
34 -> "

看看这个:

iex(5)> 'hi' == [104, 105]
true

在 Elixir 中,[104, 105][45, 67, 34] 被称为字符列表。创建 charlist [104, 105] 的快捷方式是 'hi'。这是 Erlang 糟糕 特性的结果,但是因为 Elixir 能够与 Erlang 接口,所以需要 charlists。一个 Elixir charlist 相当于一个 Erlang 字符串,而一个 Erlang 字符串相当于一个数字列表。

假设您的 Elixir 程序进行了一系列关键的数学计算,结果为:

result = [76, 64, 78, 79]

并且您想向用户显示该信息,以便他们可以调整除颤器的设置以挽救患者的生命,因此您可以这样做:

IO.puts "Set the defibrillator dials to these numbers: #{result}"

用户将看到以下内容:

Set the defibrillator dials to these numbers: L@NO

患者在这里死亡。