📜  Elixir-地图

📅  最后修改于: 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之类的功能来处理地图。

带有Atom键的地图

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

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

地图的另一个有趣特性是,它们提供了自己的语法来更新和访问原子键-

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

上面的程序产生以下结果-

1

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