📅  最后修改于: 2020-11-04 05:27:08             🧑  作者: Mango
到目前为止,我们还没有讨论任何关联的数据结构,即可以将某个值(或多个值)与键关联的数据结构。不同的语言用不同的名称来称呼这些功能,例如字典,哈希,关联数组等。
在Elixir中,我们有两个主要的关联数据结构:关键字列表和映射。在本章中,我们将重点介绍关键字列表。
在许多功能编程语言中,通常使用2项元组的列表作为关联数据结构的表示。在Elixir中,当我们有一个元组列表并且该元组的第一项(即键)是一个原子时,我们将其称为关键字列表。考虑以下示例以了解相同的内容-
list = [{:a, 1}, {:b, 2}]
Elixir支持用于定义此类列表的特殊语法。我们可以将冒号放在每个原子的末端,并完全摆脱元组。例如,
list_1 = [{:a, 1}, {:b, 2}]
list_2 = [a: 1, b: 2]
IO.puts(list_1 == list_2)
上面的程序将产生以下结果-
true
这两个代表关键字列表。由于关键字列表也是列表,因此我们可以对其使用列表上的所有操作。
要检索与关键字列表中的原子相关联的值,请将原子的名称传递给列表名称后的[]-
list = [a: 1, b: 2]
IO.puts(list[:a])
上面的程序产生以下结果-
1
关键字列表具有三个特殊特征-
为了操作关键字列表,Elixir提供了关键字模块。但是请记住,关键字列表只是列表,因此它们提供与列表相同的线性性能特征。列表越长,查找键,计算项目数等所需的时间就越长。因此,关键字列表主要在Elixir中用作选项。如果您需要存储许多项目或保证一键关联的最大一值,则应改用maps。
要访问与给定键关联的值,我们使用Keyword.get函数。它返回与给定键关联的第一个值。要获取所有值,我们使用Keyword.get_values函数。例如-
kl = [a: 1, a: 2, b: 3]
IO.puts(Keyword.get(kl, :a))
IO.puts(Keyword.get_values(kl))
上面的程序将产生以下结果-
1
[1, 2]
要添加新值,请使用Keyword.put_new 。如果密钥已经存在,则其值保持不变-
kl = [a: 1, a: 2, b: 3]
kl_new = Keyword.put_new(kl, :c, 5)
IO.puts(Keyword.get(kl_new, :c))
当上述程序运行时,它会生成带有附加键c的新关键字列表,并产生以下结果-
5
如果要删除某个键的所有条目,请使用Keyword.delete;。要仅删除键的第一个条目,请使用Keyword.delete_first 。
kl = [a: 1, a: 2, b: 3, c: 0]
kl = Keyword.delete_first(kl, :b)
kl = Keyword.delete(kl, :a)
IO.puts(Keyword.get(kl, :a))
IO.puts(Keyword.get(kl, :b))
IO.puts(Keyword.get(kl, :c))
这将删除列表中的第一个b和列表中的所有a 。当上述程序运行时,将产生以下结果-
0