当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Elixir List用法及代码示例


Elixir语言中 List 相关用法介绍如下。

链表按选定的顺序保存零个、一个或多个元素。

Elixir 中的列表在方括号之间指定:

iex> [1, "two", 3, :four]
[1, "two", 3, :four]

可以使用 Kernel.++/2 Kernel.--/2 运算符连接和减去两个列表:

iex> [1, 2, 3] ++ [4, 5, 6]
[1, 2, 3, 4, 5, 6]
iex> [1, true, 2, false, 3, true] -- [true, false]
[1, 2, 3, true]

可以使用 | 将元素添加到列表中:

iex> new = 0
iex> list = [1, 2, 3]
iex> [new | list]
[0, 1, 2, 3]

Elixir 中的列表是有效的链表,这意味着它们在内部成对表示,包含列表的头部和尾部:

iex> [head | tail] = [1, 2, 3]
iex> head
1
iex> tail
[2, 3]

类似地,我们可以仅使用这样的对(称为 cons 单元格)编写列表 [1, 2, 3]

iex> [1 | [2 | [3 | []]]]
[1, 2, 3]

一些列表,称为不正确的列表,没有一个空列表作为最后一个 cons 单元格中的第二个元素:

iex> [1 | [2 | [3 | 4]]]
[1, 2, 3 | 4]

尽管通常会避免不正确的列表,但它们会在一些特殊情况下使用,例如 iodata 和 chardata 实体(请参阅 IO 模块)。

由于它们基于单元格的表示,将元素添加到列表总是很快(恒定时间),而随着列表大小的增长(线性时间),追加变得更慢:

iex> list = [1, 2, 3]
iex> [0 | list] # fast
[0, 1, 2, 3]
iex> list ++ [4] # slow
[1, 2, 3, 4]

该模块中的大多数函数都在线性时间内工作。这意味着,执行操作所需的时间以与列表长度相同的速度增长。例如 length/1 last/1 将在线性时间运行,因为它们需要遍历列表的每个元素,但 first/1 将在恒定时间运行,因为它只需要第一个元素。

列表还实现了 Enumerable 协议,因此在 Enum 模块中可以找到许多与列表一起使用的函数。此外,在 Kernel 中还可以找到以下列表的函数和运算符:

名人录

如果列表由非负整数组成,其中每个整数代表一个 Unicode 代码点,则该列表也可以称为 charlist。这些整数必须:

  • 0..0x10FFFF (0..1_114_111) 范围内;
  • 并且超出范围 0xD800..0xDFFF ( 55_296..57_343 ),该范围在 Unicode 中为 UTF-16 代理对保留。

Elixir 使用单引号来定义字符列表:

iex> 'héllo'
[104, 233, 108, 108, 111]

特别是,如果字符列表仅包含可打印的 ASCII 字符,则默认情况下将用单引号将其打印返回:

iex> 'abc'
'abc'

即使表示发生了变化,原始数据仍然是一个数字列表,可以这样处理:

iex> inspect('abc', charlists: :as_list)
"[97, 98, 99]"
iex> Enum.map('abc', fn num -> 1000 + num end)
[1097, 1098, 1099]

您可以使用 IEx.Helpers.i/1 助手在您遇到 IEx 中的字符列表时获得它们的简明概要,它会在一个摘要中向您显示类型、说明以及原始表示。

这种行为背后的基本原理是更好地支持 Erlang 库,这些库可以将文本作为字符列表而不是 Elixir 字符串返回。在 Erlang 中,charlists 是处理字符串的默认方式,而在 Elixir 中则是二进制文件。此类函数的一个示例是 Application.loaded_applications/0

Application.loaded_applications()
#=>  [
#=>    {:stdlib, 'ERTS  CXC 138 10', '2.6'},
#=>    {:compiler, 'ERTS  CXC 138 10', '6.0.1'},
#=>    {:elixir, 'elixir', '1.0.0'},
#=>    {:kernel, 'ERTS  CXC 138 10', '4.1'},
#=>    {:logger, 'logger', '1.0.0'}
#=>  ]

如果列表仅由带有 ascii_printable?/2 的可打印 ASCII 字符组成,则可以检查该列表。

不正确的列表永远不会被视为charlists。

相关用法


注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 List。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。