Elixir - 地图


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

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

创建地图

使用 %{} 语法创建地图 -

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

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

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

访问密钥

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

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}

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

带有 Atom 键的地图

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

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

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

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

上述程序生成以下结果 -

1

请注意,要以这种方式访问​​Atomics键,它应该存在,否则程序将无法工作。