1

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

我做了这个过滤功能:

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

output: '-C"'

完全出乎意料的输出,但下面的版本“有效”

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

output: [10, 20]

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

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

4

2 回答 2

6

这是因为Elixir 和 Erlang 一样,内部没有 String 类型。单引号字符串表示为字符列表,这些通常在处理 Erlang 库时使用。当您将列表提供给 Elixir 时[45, 67, 34],它会将其显示为ASCII 字符 46、67 和 34的列表;是-,C".

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

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

于 2018-09-19T22:58:18.360 回答
2

这是因为 Elixir 和 Erlang 一样,内部没有 String 类型

不管什么意思。弦乐,Smings。它很简单:

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

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

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

看这个:

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

在 Elixir 中,[104, 105][45, 67, 34]称为 charlists。创建 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

病人死在这里。

于 2018-09-20T00:50:48.713 回答