一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Erlang - Erlang中的映射組Map詳細介紹

Erlang中的映射組Map詳細介紹

2020-05-27 10:50腳本之家 Erlang

這篇文章主要介紹了Erlang中的映射組Map詳細介紹,本文講解了創建映射組、更新映射組、兩種操作符的區別、映射的增加、刪除、獲取等內容,需要的朋友可以參考下

主要是遇到 Map匹配的問題,所以順便回憶一下 Erlang 中的映射組 Map,在其它語言中被稱作 Hash 哈希或者 Dict 字典。

Erlang 從 R17 版本開始支持映射組

創建映射組

Erlang 中的映射組用結構 #{} 表示,創建一個映射組可以這樣

復制代碼 代碼如下:


% 不管你怎么排序,最終結果都是按鍵的字典順序排列的
#{ name => "wittyfox", age => 19 }.
% => #{age => 20,name => "wittyfox"}

 

% 也可以創建一個空的映射組
#{}.
% => #{}

 

更新映射組

映射組可以更新,所謂的更新是創建一個新的映射組,因為 Erlang 中的變量是不可改變的。

復制代碼 代碼如下:


% 現在的我
Me = #{ name => "wittyfox", age => 19 }.
% => #{age => 19,name => "wittyfox"}

 

% 過年啦,又長一歲了,變成嶄新的我啦
NewMe = Me#{ age => 20 }.
% => #{age => 20,name => "wittyfox"}

% 當然也可以直接修改
#{ name => "wittyfox", age => 19 }#{ age => 20 }.
% => #{age => 20,name => "wittyfox"}

 

=> 用于創建或更新一個映射,如果鍵存在,則更新它,否則就創建一個新的映射。如果一不小心某個鍵拼寫錯誤,Oops.

復制代碼 代碼如下:

% 本來想更新 age,結果一不小心拼寫錯誤,創建了一個新的映射
Me#{ aeg => 20 }.
% => #{aeg => 20,age => 19,name => "wittyfox"}.


為了避免這種情況,還有一種更新映射的方法,使用 :=,它只能用來更新映射,而不能創建新的映射,如果鍵不存在,就會拋出一個 badarg 異常。

復制代碼 代碼如下:


% 不存在 aeg 鍵,拋出 badarg 異常
Me#{ aeg := 20 }.
% ** exception error: bad argument ... blabla

 

% 只能更新已存在的映射
Me#{ age := 20 }.
% => #{age => 20,name => "wittyfox"}

 

兩種操作符的區別

1.=> 可以用來更新映射或者創建新的映射
2.:= 只能更新映射,在鍵不存在時會拋出異常
所以有下面的總結

創建映射組時

只能使用 =>,:= 只能更新映射而無法創建新的映射,而創建映射組時需要創建若干映射

復制代碼 代碼如下:

#{ 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]).


注意

 

上面的更新映射,創建新的映射以及匹配可以同時針對多個映射,這里只是作為例子而只選擇一對映射。

映射組操作

Erlang 中的 maps 模塊用于操作映射組

映射組的創建及屬性

復制代碼 代碼如下:


% 創建映射組
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

 

映射的增加、刪除、獲取

復制代碼 代碼如下:


% 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

 

映射組的歸并

復制代碼 代碼如下:


% 歸并兩個映射組,注意第二個參數是創建新的映射組,所以只能用 =>
maps:merge(Me, #{ age => 10 }).  
% => #{age => 10,name => "wittyfox"}

 

% 相當于
Me#{ age => 10 }.

 

映射組與列表之間的轉換

復制代碼 代碼如下:


% 返回映射元組對的列表
maps:to_list(Me).
% => [{age,19},{name,"wittyfox"}]

 

% 從列表構建映射組
maps:from_list([]).
% => #{}

maps:from_list([{name, "wittyfox"}, {age, 19}]).
% => #{age => 19,name => "wittyfox"}

 

映射組的遍歷

復制代碼 代碼如下:


% 對映射組的每對映射執行操作
% 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

 

映射組中映射的選取

返回第一個參數中指定的鍵的映射組成的映射組

復制代碼 代碼如下:


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"}


注意

 

值得一提的是 maps 模塊中的若干函數,比如 map, fold, with 和 without 都是使用 maps:to_list/1 轉到列表,然后使用 lists 模塊的工具處理,然后使用 maps:from_list/1 轉回到映射組的。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 高清欧美不卡一区二区三区 | 日韩欧美推理片免费在线播放 | 娇女的呻吟亲女禁忌h16 | 草莓香蕉绿巨人丝瓜榴莲18 | 91九色porn偷拍在线 | 亚洲精品一区二区三区在线观看 | 午夜香蕉 | 国产精品网站在线观看 | 青草免费在线 | 欧美色图日韩色图 | 99久久精品在免费线18 | 精品国产一区二区三区在线观看 | 日本女人www | 欧美在线看片a免费观看 | 日本孕妇大胆孕交 | 免费观看国产精品 | 午夜亚洲一区二区福利 | 日韩欧美在线看 | 羞羞麻豆国产精品1区2区3区 | 大肚孕妇的高h辣文 | 日本一本草久p | 日本欧美大码a在线视频播放 | 国产探花视频在线观看 | 日产乱码卡一卡2卡三卡四福利 | 久久AV国产麻豆HD真实乱 | 国产精品视频免费看 | 清清草在线视频 | 热久久最新| 成人在线免费看 | 果冻传媒在线观看的 | 欧美人shou交在线播放 | 2019国产精品 | 天天做天天爱天天操 | 国产综合成色在线视频 | 国产精品 视频一区 二区三区 | 亚洲精品资源在线 | 国产馆精品推荐在线观看 | 色偷偷91久久综合噜噜噜 | 色综合久久九月婷婷色综合 | 日本妻子迷妹网 | 动漫白丝袜美女羞羞 |