Elixir - 映射

关键字列表是按键寻址列表中存储的内容的便捷方法,但在底层,Elixir 仍在遍历列表。 如果您对该列表有其他计划需要遍历所有内容,那么这可能是合适的,但如果您计划使用键作为访问数据的唯一方法,那么这可能是不必要的开销。

这就是映射可以帮助您的地方。 每当您需要键值存储时,映射就是 Elixir 中的"首选"数据结构。

创建映射

使用 %{} 语法创建映射 −

map = %{:a => 1, 2 => :b}

与关键字列表相比,我们已经可以看到两个差异 −

  • 映射允许任何值作为键。
  • 映射的键不遵循任何顺序。

访问key键

为了访问与键关联的值,映射使用与关键字列表相同的语法 −

map = %{:a => 1, 2 => :b}
IO.puts(map[:a])
IO.puts(map[2])

当上面的程序运行时,会产生以下结果 −

1
b

插入键

要在映射中插入键,我们使用 Dict.put_new 函数,该函数将映射、新键和新值作为参数 −

map = %{:a => 1, 2 => :b}
new_map = Dict.put_new(map, :new_val, "value") 
IO.puts(new_map[:new_val])

这将在新映射中插入键值对 :new_val - "value"。 当上面的程序运行时,会产生以下结果 −

"value"

更新值

要更新映射中已有的值,您可以使用以下语法 −

map = %{:a => 1, 2 => :b}
new_map = %{ map | a: 25}
IO.puts(new_map[:a])

当上面的程序运行时,会产生以下结果 −

25

模式匹配

与关键字列表相反,映射对于模式匹配非常有用。 当在模式中使用映射时,它将始终匹配给定值的子集 −

%{:a => a} = %{:a => 1, 2 => :b}
IO.puts(a)

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

1

这会将 a1 匹配。 因此,它将生成输出为 1

如上所示,只要给定映射中存在模式中的键,映射就会匹配。 因此,空映射可以匹配所有映射。

在访问、匹配和添加映射键时可以使用变量 −

n = 1
map = %{n => :one}
%{^n => :one} = %{1 => :one, 2 => :two, 3 => :three}

b1 提供了与关键字模块非常相似的 API,具有操作映射的便捷功能。 您可以使用Map.get、Map.delete等函数来操作映射。

带有 Atom 键的映射

映射具有一些有趣的属性。 当映射中的所有键都是原子时,为了方便起见,可以使用关键字语法 −

map = %{:a => 1, 2 => :b} 
IO.puts(map.a) 

映射的另一个有趣的属性是它们提供自己的语法来更新和访问原子键 −

map = %{:a => 1, 2 => :b}
IO.puts(map.a)

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

1

请注意,要以这种方式访问原子关键字,它应该存在,否则程序将无法运行。