📅  最后修改于: 2020-11-04 08:25:49             🧑  作者: Mango
关键字列表是一种方便的方法,可以通过关键字来寻址存储在列表中的内容,但是在下面,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
这将与1。因此,它将生成输出为1 。
如上所示,只要模式中的键存在于给定的地图中,地图就会匹配。因此,空地图将匹配所有地图。
在访问,匹配和添加映射键时可以使用变量-
n = 1
map = %{n => :one}
%{^n => :one} = %{1 => :one, 2 => :two, 3 => :three}
Map模块提供了与Keyword模块非常相似的API,并具有方便的功能来操作地图。您可以使用Map.get,Map.delete之类的功能来处理地图。
地图具有一些有趣的属性。当映射中的所有键都是原子时,为了方便起见,可以使用关键字语法-
map = %{:a => 1, 2 => :b}
IO.puts(map.a)
地图的另一个有趣特性是,它们提供了自己的语法来更新和访问原子键-
map = %{:a => 1, 2 => :b}
IO.puts(map.a)
上面的程序产生以下结果-
1
请注意,以这种方式访问原子键,它应该存在,否则程序将无法运行。