当我们谈论Erlang Maps时,我们谈论什么 Part 2
Posted jzssuanfa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当我们谈论Erlang Maps时,我们谈论什么 Part 2相关的知识,希望对你有一定的参考价值。
声明:本文讨论的Erlang Maps是基于17.0-rc2,时间2014-3-4.兴许Maps可能会出现语法或函数API上的有所调整,特此说明.
前情提要: [Erlang 0116] 当我们谈论Erlang Maps时,我们谈论什么 Part 1
继续昨天的话题,在Erlang Factory SF Bay Area 2013有一个议题:"Where are we on the Map?" [PDF ],这个Talk基本上就是选取了EEP43的要点,有兴趣的同学能够FQ观看视频 Where are We on the Map?
- Kenneth Lundin - YouTube 假设是腿脚不利索的,能够看墙内的.细致阅读EEP43,其信息量巨大,包括Maps的设计演变来龙去脉,各种取舍,也是我们学习设计的极佳范例.以下我将依照自己的逻辑顺序又一次解读EEP43,先从怎样使用開始,直观上感受一下区别,然后再回答"何必有我"的问题.
Maps Basic
EEP43 给出了Map比較规范的定义, Map M包括一定数量的键值对,实现从K1..Kn到V1..Vn的映射,当中没有两个Key是相等的(equal). equal指的是K1==K2,matching指的是K1 =:= K2. erlang:is_map(M)用于推断数据是否map类型.只是依照如今的情况,当出现1.0和1做key的时候,结果和EEP43中设计的结果不同,还是要看下一个版本号是怎么处理的,这个不小心就是个坑:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | Eshell V6.0 (abort with ^G) 1> M=#{1=>a}. %% Construction syntax #{1 => a} 2> M#{1.0 => b}. #{1 => a,1.0 => b} 3> M#{1 => b}. #{1 => b} 4> M#{1 := b}. #{1 => b} 5> M#{1.0 := b}. ** exception error: bad argument in function maps:update/3 called as maps:update(1.0,b,#{1 => a}) in call from erl_eval: \'-expr/5-fun-0-\' /2 (erl_eval.erl, line 249) in call from lists:foldl/3 (lists.erl, line 1261) 6> M2= #{1=>a,1=>b,1.0 =>c}. #{1 => b,1.0 => c} 7> 1 == 1.0. true 8> #{1.0 =>a ,1 =>b}. #{1 => b,1.0 => a} |
构造Map的时候我们重点要验证的就是"Maps in Erlang are ordered, Important!!!! – Maps with the same set of keys are always presented in the same way":