Elixir - 关键字列表

到目前为止,我们还没有讨论任何关联数据结构,即可以将某个值(或多个值)与一个键关联起来的数据结构。 不同的语言用不同的名称来调用这些功能,例如字典、哈希、关联数组等。

在 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

这两个都代表一个关键字列表。 由于关键字列表也是列表,因此我们可以在它们上使用在列表上使用的所有操作。

要检索与关键字列表中的原子关联的值,请将原子 as 传递给列表名称后的 [] −

list = [a: 1, b: 2]
IO.puts(list[:a])

上面的程序生成以下结果 −

1

关键字列表具有三个特殊特征 −

  • 关键字必须是原子。
  • 关键字是按照开发者指定的顺序订购的。
  • 关键字可以多次授予。

为了操作关键字列表,Elixir 提供了 Keyword 关键字模块。 但请记住,关键字列表只是列表,因此它们提供与列表相同的线性性能特征。 列表越长,查找键、计算项目数等所需的时间就越长。 因此,Elixir 中的关键字列表主要用作选项。 如果您需要存储很多项或保证一键关联最多一个值,则应该使用映射。

访问关键字

要访问与给定键关联的值,我们使用 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