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

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

我刚开始用药剂。我正在使用ExUnit为我自己实现的简单可枚举函数编写一些测试,而不使用标准Enum模块。

在我的测试中,我发现每当我引用列表[7, 8, 9],一旦打印成stdout,我就看到了char列表。'\a\b\t'..为什么会发生这种事?


繁花如伊
浏览 389回答 2
2回答

30秒到达战场

长生不老药有两种字符串:二进制(双引号)和字符列表(单引号)。后者是从Erlang继承的,内部表示为整数列表,这些整数映射到字符串的代码点。当您使用类似于inspect和IO.inspect,Elixir试图变得聪明,并将整数列表格式化为字符串,以便于阅读。但是,在某些情况下,因为列表中的所有整数恰好都是有效的代码点,所以最终得到的是一个无意义的字符串。例如,A到Z在ASCII中表示为整数65到90。iex>&nbsp;IO.inspect&nbsp;[65,&nbsp;66,&nbsp;67] 'ABC'如果您喜欢打印原始列表,则可以使用charlists: :as_lists选择。有关选项的完整列表,请启动iex和类型h Inspect.Opts.iex>&nbsp;IO.inspect&nbsp;[65,&nbsp;66,&nbsp;67],&nbsp;charlists:&nbsp;:as_lists [65,&nbsp;66,&nbsp;67]如果药剂<1.4,您可以使用char_lists: false.顺便说一句,这并不是Elixir向您隐藏底层构建块的唯一情况,它还会发生在二进制文件(双引号字符串)和结构中。更深层次的原因是Elixir和Erlang没有用户定义的类型,因此无法区分列表和单引号字符串,因为它们都是列表。然而,在其他情况下,这也是一种优势。例如,它允许我们在Elixir和Erlang中对任何数据结构进行琐碎的序列化,因为它只能从语言附带的基本构建块中构建。

蓝山帝景

虽然@Patrick的答案是绝对正确的,但您也可以配置IEx总是显示charlists作为常规列表,而不是手动调用inspect每次:iex>&nbsp;IEx.configure(inspect:&nbsp;[charlists:&nbsp;:as_lists])#&nbsp;=>&nbsp;:okiex>&nbsp;[65,&nbsp;66,&nbsp;67]#&nbsp;=>&nbsp;[65,&nbsp;66,&nbsp;67]iex>&nbsp;'ABC'#&nbsp;=>&nbsp;[65,&nbsp;66,&nbsp;67]这是一个支持选项的完整列表
打开App,查看更多内容
随时随地看视频慕课网APP