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 中的字符列表时获得它们的简明概要,它会在一个摘要中向您显示类型、说明以及原始表示。IEx.Helpers.i/1
这种行为背后的基本原理是更好地支持 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 字符组成,则可以检查该列表。ascii_printable?/2
不正确的列表永远不会被视为charlists。
相关用法
- Elixir List.keyfind!用法及代码示例
- Elixir List.keystore用法及代码示例
- Elixir List.to_float用法及代码示例
- Elixir List.to_string用法及代码示例
- Elixir List.myers_difference用法及代码示例
- Elixir List.starts_with?用法及代码示例
- Elixir List.to_charlist用法及代码示例
- Elixir List.insert_at用法及代码示例
- Elixir List.keymember?用法及代码示例
- Elixir List.to_tuple用法及代码示例
- Elixir List.to_atom用法及代码示例
- Elixir List.delete_at用法及代码示例
- Elixir List.replace_at用法及代码示例
- Elixir List.first用法及代码示例
- Elixir List.keyreplace用法及代码示例
- Elixir List.keysort用法及代码示例
- Elixir List.ascii_printable?用法及代码示例
- Elixir List.zip用法及代码示例
- Elixir List.last用法及代码示例
- Elixir List.to_integer用法及代码示例
- Elixir List.foldl用法及代码示例
- Elixir List.improper?用法及代码示例
- Elixir List.foldr用法及代码示例
- Elixir List.delete用法及代码示例
- Elixir List.to_existing_atom用法及代码示例
注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 List。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。