第5章 记录与映射组

1.创建记录:记录的后缀名为.hrl

%%records.hrl:
-record(todo,{status=reminder,who=joe,text}).

1>rr("records.hrl").
2>#todo{}
#todo{status = reminder,who = joe,text = undefined}

2.更新记录

1>X1=#todo{status=urgent,text="Fix errata in book"}.
#todo{status = urgent,who = joe,text = "Fix errata in book"}

3.提取记录字段

1>#todo{who=W,text=Txt} = X1.
2>W. 
joe 
3>Txt. 
"Fix errata in book "
4>X1#todo.text.
"Fix errata in book "
5>X1#todo{text="good"}.
#todo{who=joe,text="good"}

4.映射组

     语法: #{key Op Vall , key Op val2...} 注意:Op有两种格式: => 和 :=   

     在第一次定义值时使用 => ,当进行更新值时使用 :=

1>F1=#{a=>1,b=>2}.
#{a =>1,b=>2}
2>F2=F1#{a:=2}
#{a=>2,b=>2}
3>F3= F1#{c =>3}.
#{a =>2,b=>2,c=>3}.
4>F4=F1#{c:=3}
%%将会报错,因为F1中不存在C

5.映射组的内置函数

  • 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 把一个包含键值对的列表转换成映射组M.如果同样的键不止一次出现,就使用列表里第一个键所关联的值,后续的值都会被忽略。
  • maps:map_size(Map) -> NumberOfEntries 返回映射组里的条目数量
  • maps:is_key(Key,Map) -> bool() 如果映射组包含一个键为Key的项7就返回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的项(如果有的话)被移除外,其他与M一致
  • maps:without([Key1,...,KeyN],M) -> M1 返回一个新映射组M1,它是M的复制,但移除了带有[Key1,...,KeyN]列表里这些键的元素。
  • maps:difference(M1,M2) -> M3 M3是M1的复制,但移除了那些与M2里的元素具有相同键的元素。

6.映射组排序问题:映射组在比较时首先会比较大小,然后再按照键的排序比较键和值.

7.以JSON为桥梁

  • maps:to_json(Map) ->Bin 映射组转换为二进制
  • maps:from_json(Bin) -> Map 二进制转换为映射组
  • maps:safe_from_json(Bin) ->Map Bin中的任何原子必须在调用次内置函数前就已经存在,否则跑出一个异常错误.可以防止创建大量的新原子.

猜你喜欢

转载自blog.csdn.net/qq_34755443/article/details/84315663