Erlang(6):記錄和映射組

記錄record:shell

是元組的另外一種形式json

-record(Name, {
				key1 = Default1,
				key2 = Default2,
				...
				key3,
				...
				}).
記錄比較像C++的結構和類。
.hrl有點想C++的.h文件
test.hrl
-record(todo, {status = reminder, who = joe, text}).
定義一個叫作todo的記錄。指定了默認值。
31> rr("test.hrl").
[todo]
在shell裏面讀入記錄的定義。rr()是read records的縮寫。
32> #todo{}. %建立一個todo對象
#todo{status = reminder,who = joe,text = undefined}
33> X1 = #todo{status=urgent, text="Fix errata in book"}.%建立一個to對象
#todo{status = urgent,who = joe,text = "Fix errata in book"}
34> X2 = X1#todo{status=done}.%建立一個to對象,使用X1來複制
#todo{status = done,who = joe,text = "Fix errata in book"}
提取字段,採用模式匹配的方式,或者單個字段訪問
37> #todo{who = W, text = Txt} = X2.
#todo{status = done,who = joe,text = "Fix errata in book"}
38> W.
joe
39> Txt.
"Fix errata in book"
40> X2#todo.text.
"Fix errata in book"
函數裏模式匹配記錄
f(#todo{status= S, who=W} = R)->
	R#todo{status=finished}%整個記錄進行操做
	S = finished%單個字段操做
do_something(X) when is_record(X, todo) ->%匹配特定類型的記錄
	...

映射組map
跟C++的map差很少。
建立一個映射組:
A = #{Key1 Op Val1, Key2 Op Val2, ..., KeyN Op ValN}.
B = A#{Key1 Op Val1, Key2 Op Val2, ..., KeyN Op ValN}.
表達式K => Val1有兩種用途,一種是現有鍵K的值更新爲新值V,另外一種是給映射組添加一個全新的K-V對。
表達式K:=V的做用是將現有的鍵K的值更新爲新值V。並且,這個方式效率高,通常優先使用這個。
映射組的內置函數
maps:new()->#{} 返回一個空映射組。
erlang:is_map(M)->bool() 若是M是映射組就返回true,不然返回false。
maps:to_list(M)->[{K1,V1},...,{KN,VN}]
把映射組M裏的全部鍵和值轉換成爲一個鍵值列表。
maps:from_list([{K1,V1},...,{KN,VN}])->M 把一個包含鍵值對的列表轉換成映射組。
maps:map_size(Map)->NumberOfEntries 返回映射組的條目數量
maps:is_key(key,Map)->bool() 若是映射組包含一個鍵爲Key的項就返回true,不然返回false。
maps:get(Key,Map)->Val 返回映射組裏與Key關聯的值,不然拋出一個異常錯誤。
maps:find(Key,Map)->{ok,Value}|error 返回應這組裏與Key關聯的值,不然返回error。
maps:keys(Map)->[Key1,...,KeyN] 返回映射組包含的鍵列表,按升序排列。
maps:remove(Key,M)->M1 返回一個新映射組M1,移除了Key。
maps:without([Key1,...,KeyN],M)->M1 返回一個新的映射組M1,移除了[Key1,...,KeyN]列表的元素。
maps:difference(M1, M2)->M3 M3是M1的複製,移除了M2。
映射組能夠比較大小,先按長度,而後按元素的鍵值比較。
maps:to_json(Map)->Bin 把映射組轉換成二進制型,包含了JSON表示的該映射組。
maps:from_json(Bin)->Map 把一個包含JSON數據的二進制型轉換成映射組。
maps:safe_from_json(Bin)->Map 把一個包含JSON數據的二進制型轉換成映射組。Bin裏面的任何原子都必須已經存在,不然會拋異常。
相關文章
相關標籤/搜索