映射的增加、删除、获取 注意

【最佳答案】maps:get/2 在键不存在时会抛出异常 maps:get(age, Me).=> 19maps:get/3 在键不存在时会返回第三个参数的值 maps:get(aeg, Me, 20).=> 20用于更新或创建映射,映射的增加、删除、获取1 % maps:get/2 在键不存在时会抛出异常 maps:get(age, Me). % => 19 % maps:get/3 在键不存在时会返回第三个参数的值 maps:get(aeg, Me, 20). % => 20 % 用于更新或创建映射,类似于 => % 所谓更新,只是返回更新后的新的映射组,原映射组并不会改变 maps:put(gender, male, Me). % => #{age => 19,gender => male,name => "wittyfox"} % 用于更新映射,类似于 :=,键不存在时会抛出 badarg 异常 maps:update(age, 20, Me). % => #{age => 20,name => "wittyfox"} % 删除一个映射,键不存在时相当于什么都没做,不会抛出异常 maps:remove(age, Me). % => #{name => "wittyfox"} % 查找键的值,键不存在时返回 error maps:find(age, Me). % => {ok, 19} maps:find(aeg, Me). % => error 注意2 值得一提的是 maps 模块中的若干函数,比如 map, fold, with 和 without 都是使用 maps:to_list/1 转到列表,然后使用 lists 模块的工具处理,然后使用 maps:from_list/1 转回到映射组的 。
点赞


两种操作符的区别3=> 可以用来更新映射或者创建新的映射:= 只能更新映射,在键不存在时会抛出异常所以有下面的总结
创建映射组时 只能使用 =>,:= 只能更新映射而无法创建新的映射,而创建映射组时需要创建若干映射
#{ name := "wittyfox", age := 19 }. % * 1: only association operators '=>' are allowed in map construction 映射组匹配的 左边只能使用 :=,=> 在键不存在时可以创建新的映射,而映射组匹配可以部分匹配 (只匹配左边拥有的部分) ,所以匹配是没有意义的
% 部分匹配: 我们只想取出 age,所以我们只关心参数中有没有 age 这个映射 #{ age := Age } = Me. % => #{age => 19,name => "wittyfox"} % Age. % => 19 % 不合法的匹配 #{ age => Age } = Me. % * 1: illegal pattern 为了更好的发现错误 【映射的增加、删除、获取 注意】只在创建映射组或明确需要创建新的映射时使用 =>,而在其它场合均使用 :=
% 这里是创建映射组,只能使用 => new() -> {ok, {?MODULE, #{name => "wittyfox", age => 19}}}. % 这里是匹配,只能使用 := show({?MODULE, #{name := Name, age := Age}}) -> io:format("Name: ~p, Age: ~p~n", [Name, Age]). 映射组的创建及属性4 % 创建映射组 maps:new(). % => #{} % 返回所有键 maps:keys(Me). % => [age,name] % 判断是否存在键 maps:is_key(age, Me). % => true maps:is_key(aeg, Me). % => false % 按键的顺序返回所有值 maps:values(Me). % =>[19,"wittyfox"] % 映射数量 maps:size(Me). % => 2 % 还可以使用 erlang:map_size/1 % 此函数可以用于 Guard,maps 模块内部也是使用此函数的 map_size(Me). % => 2 映射组的归并5 % 归并两个映射组,注意第二个参数是创建新的映射组,所以只能用 => maps:merge(Me, #{ age => 10 }).% => #{age => 10,name => "wittyfox"} % 相当于 Me#{ age => 10 }. 映射组与列表之间的转换6 % 返回映射元组对的列表 maps:to_list(Me). % => [{age,19},{name,"wittyfox"}] % 从列表构建映射组 maps:from_list([]). % => #{} maps:from_list([{name, "wittyfox"}, {age, 19}]). % => #{age => 19,name => "wittyfox"} 映射组中映射的选取7 返回第一个参数中指定的键的映射组成的映射组 maps:with([], Me). % => #{} maps:with([age], Me). % => #{age => 19} % 键可以不存在 maps:with([aeg], Me). % => #{} 返回键不再第一个参数的列表中的映射组成的映射组 maps:without([], Me). % => #{age => 19,name => "wittyfox"} maps:without([age], Me). % => #{name => "wittyfox"} % 键也可以不存在 maps:without([age, neme], Me). % => #{name => "wittyfox"} 注意8 上面的更新映射,创建新的映射以及匹配可以同时针对多个映射,这里只是作为例子而只选择一对映射 。
映射组操作 Erlang 中的 maps 模块用于操作映射组
映射组的遍历9 % 对映射组的每对映射执行操作 % X, Y 分别为一对映射的键和值 maps:map(fun (X, Y) -> io:format("~p => ~p~n", [X, Y]) end, Me). % age => 19 % 输出 % name => "wittyfox" % 输出 % => #{age => ok,name => ok} % 返回值 % X, Y 分别为一对映射的键和值,V 为上一次迭代的结果,0 为迭代的初始值 % 这里简单的用于每次迭代时值加 1,结果就是映射组的映射数量 maps:fold(fun (X, Y, V) -> V + 1 end, 0, Me). % => 2