Erlang(6):记录和映射组

记录record:

是元组的另一种形式

-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里面的任何原子都必须已经存在,否则会抛异常。



posted @ 2017-01-16 18:38  肥宝游戏  阅读(370)  评论(0编辑  收藏  举报