为了账号安全,请及时绑定邮箱和手机立即绑定

解释为char列表的灵丹妙药列表

解释为char列表的灵丹妙药列表

解释为char列表的灵丹妙药列表我刚开始用药剂。我正在使用ExUnit为我自己实现的简单可枚举函数编写一些测试,而不使用标准Enum模块。在我的测试中,我发现每当我引用列表[7, 8, 9],一旦打印成stdout,我就看到了char列表。'\a\b\t'..为什么会发生这种事?
查看完整描述

2 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

长生不老药有两种字符串:二进制(双引号)和字符列表(单引号)。后者是从Erlang继承的,内部表示为整数列表,这些整数映射到字符串的代码点。

当您使用类似于inspectIO.inspect,Elixir试图变得聪明,并将整数列表格式化为字符串,以便于阅读。但是,在某些情况下,因为列表中的所有整数恰好都是有效的代码点,所以最终得到的是一个无意义的字符串。例如,A到Z在ASCII中表示为整数65到90。

iex> IO.inspect [65, 66, 67]
'ABC'

如果您喜欢打印原始列表,则可以使用charlists: :as_lists选择。有关选项的完整列表,请启动iex和类型h Inspect.Opts.

iex> IO.inspect [65, 66, 67], charlists: :as_lists
[65, 66, 67]

如果药剂<1.4,您可以使用char_lists: false.

顺便说一句,这并不是Elixir向您隐藏底层构建块的唯一情况,它还会发生在二进制文件(双引号字符串)和结构中。

更深层次的原因是Elixir和Erlang没有用户定义的类型,因此无法区分列表和单引号字符串,因为它们都是列表。然而,在其他情况下,这也是一种优势。例如,它允许我们在Elixir和Erlang中对任何数据结构进行琐碎的序列化,因为它只能从语言附带的基本构建块中构建。


查看完整回答
反对 回复 2019-07-09
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

虽然@Patrick的答案是绝对正确的,但您也可以配置IEx总是显示charlists作为常规列表,而不是手动调用inspect每次:

iex> IEx.configure(inspect: [charlists: :as_lists])# => :okiex> [65, 66, 67]# => [65, 66, 67]iex> 'ABC'# => [65, 66, 67]

这是一个支持选项的完整列表


查看完整回答
反对 回复 2019-07-09
  • 2 回答
  • 0 关注
  • 384 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信