Maps
maps 是elixir中的一个基础的数据结构,存储格式为key-value(键-值)对,语法为 %{}
map的两个特点:
- Maps 允许任何值做 key
- Maps 的 key 不能排序
- Maps 的语法格式
当map的key是一个atom时,可以采用key: value的写法,获取时也可以使用map.key的方式获取
注意⚠️:采用map[:key]获取不存在的值,返回的时nil,采用map.key获取不存在的值,返回的是keyErroriex(1)> map = %{ :a => 1, 2 => :b} %{ 2 => :b, :a => 1} iex(2)> map[:a] 1 iex(3)> map[2] :b iex(4)> map[:b] nil iex(5)>
- Map 模式匹配
iex(5)> %{ :a => a} = %{ :a => 1, 2 => :b} %{ 2 => :b, :a => 1} iex(6)> a 1 iex(7)>
- 更新Map的值
注意⚠️:若更新的key,在map中不存在,则会报KeyError。iex(14)> map = %{ :a => 1, 2 => :b} %{ 2 => :b, :a => 1} iex(15)> %{ map | 2 => "two"} %{ 2 => "two", :a => 1} iex(16)> %{ map | :c => "two"} ** (KeyError) key :c not found in: %{ 2 => :b, :a => 1} (stdlib 4.0.1) :maps.update(:c, "two", %{ 2 => :b, :a => 1}) (stdlib 4.0.1) erl_eval.erl:309: anonymous fn/2 in :erl_eval.expr/6 (stdlib 4.0.1) lists.erl:1350: :lists.foldl/3 iex(16)>
- Map module API
iex(32)> map1 = %{ 2 => :a, "hello" => 3, "c" => 3, a: 1, b: 2} %{ 2 => :a, :a => 1, :b => 2, "c" => 3, "hello" => 3} iex(33)> map2 = %{ x: 1, y: 2} %{ x: 1, y: 2}
-
Map.delete(map, key): 从指定的map中,删除指定的key, 如果key不存在,不会有任何改变
map1 = %{ 2 => :a, "hello" => 3, "c" => 3, a: 1, b: 2} %{ 2 => :a, :a => 1, :b => 2, "c" => 3, "hello" => 3} iex(34)> Map.delete(map1, 2) %{ :a => 1, :b => 2, "c" => 3, "hello" => 3} iex(35)
-
Map.drop(map, keys): 从指定的map中删除指定的一组keys
iex(35)> map1 %{ 2 => :a, :a => 1, :b => 2, "c" => 3, "hello" => 3} iex(36)> Map.drop(map1, ["c", 2]) %{ :a => 1, :b => 2, "hello" => 3} iex(37)>
-
Map.equal?(map1, map2): 比较2个map是否完全相同;此函数没有太大意义。在使用过程中,要完成此功能,一般使用
==/2
,===/2
iex(39)> map1 %{
-