记录其实就是元组的另一种形式。通过使用记录,可以给元组里的各个元素关联一个名称。
映射组是键-值的关联性集合。键可以是任意的Erlang数据类型。
1. 何时使用映射组或记录
使用记录的情况:
1. 当你可以用一些预定且数量固定的原子来表示数据时;
2. 当记录里的元素数量和元素名称不会随着时间而改变时;
3. 当存储空间是个问题时,典型的案例是你有一大堆元组,并且没一个元组都有相同的结构。
使用映射的情况:
1. 当键不能预先知道时用来表示键-值数据结构;
2. 当存在大量不同的键时用来表示数据;
3. 当方便使用很重要而效率无关紧要时作为万能的数据结构实现;
4. 用作“自解释型”的数据结构,也就是说,用户容易从键名猜出键值的含义;
5. 用来表示键-值解析树,例如XML或配置文件;
6. 用Json来和其他编程语言通信。
2. 通过记录命名元组里的项
一旦命名了元组里的元素,就可以通过名称来指向他们,而不必记住它们在元组里面的具体位置。
-record(Name,{
%%以下两个键带有默认值
key1 = Default1,
key2 = Default2,
……
%%下一行就相当于key 3 = undefined
key3,
……
}).
举个栗子,假设想要操作一个待办项列表。我们首先定义一个todo记录,然后将它保存在一个文件里(记录的定义既可以保存在Erlang源代码文件里,也可以由扩展名为.hrl的文件保存,然后包含在源代码文件里)。
文件包含是唯一能确保多个Erlang模块共享记录定义的方式。类似于C语言中的.h文件保存公众定义,然后包含在源代码文件里。
-record(todo, {status=reminder, who = joe, text}).
记录一旦被定义,就可以创建记录的实例了。
在Shell中,必须先把记录的定义读入shell,然后才能创建记录。我们将用shell函数rr(read records 的缩写,即读取记录)来实现。
rr("records.hrl").
2.1 创建和更新记录
创建新的记录:
#todo{}.
X1 = #todo{status=urgent, text="Fix errata in book"}.
复制一个现有的记录
X2 = X1#todo{status=done}.
X2是创建了X1的一个副本(类型必须是todo),并修改字段status的值为done。请记住生成的是原始记录的一个副本,原始记录并没有变化。
2.2 提取记录字段
在一次操作中提取记录的多个字段,可以使用模式匹配。
#todo{who = W, text = Txt} =