运行此函数时,为什么我的iex返回“ -C”或“ -A”

时间:2018-09-19 21:57:50

标签: erlang elixir otp iex

我已经学习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'

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

2 个答案:

答案 0 :(得分:6)

这是因为Elixir, like Erlang, doesn't internally have a String type。单引号字符串表示为字符列表,这些字符串通常在处理Erlang库时使用。当您为Elixir提供列表settings时,它将显示为ASCII characters 46, 67, and 34的列表。分别是[45, 67, 34]-C

如果列表中至少有一个数字不代表可打印字符,则会看到数字列表。由于"不会映射到可打印的字符,因此在第二个示例中,您将看到1010

请务必注意,您创建的列表仍在内部表示为20,因此您执行的所有列表操作都将完全按照您希望的数字进行操作。

答案 1 :(得分:2)

  

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

无论什么意思。弦乐,杂物。就像这样简单:

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]被称为字符列表。创建字符列表[104, 105]的快捷方式是'hi'。这是Erlang的糟糕功能的结果,但是由于Elixir能够与Erlang交互,因此需要字符列表。 Elixir字符列表等效于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

患者在这里死亡。