*Record(记录)概述
---概念
record是erlang提供的一种作用于元组的语法,提供了给元组中元素命名的机制,以方便操作元组中的元素,实现了更加有序的元组.
---语法
-record(Record_Name, %%或许更合适的说法是Record_Type,以后通过#RecordName的方式创建记录的实例,这里的Record_Name并非表示定义中的元组/记录实例.
{
key1 = Default1,
key2 = Default2,
...
keyn, //keyn = undefined
...
}).
*记录的一般使用
以下以记录示例:
-record(dzh_info,{name=dzh,age=27}).
1)复制/更新记录,根据记录的名称复制产生记录,原来记录的内容不改变.语法:变量 = #记录类型{有内容时更新原有的定义}
X1 = #dzh_info{name=daizhong}. ->#dzh_info{name=daizhong,age=27}. %%"{...}"里面可以对dzh_info定义的内容重新赋值,但是不会改变dzh_info.
2)通过记录实现变量的模式匹配
#dzh_info{name=Name,age=Age} = X1. %%Name.->daizhong,Age.->27.
3)获取记录的一个域值,语法:记录实例#记录类型.域名
X1#dzh_info.name. –>daizhong
*测试程序
records.hrl%%定义记录 -record(dzh_info,{name=dzh,age=27}).
t_records.erl-module(t_records). -export([new_dzh/0,new_dzh/1,get_dzh_name/1]). -include("records.hrl"). -compile(export_all). new_dzh() -> #dzh_info{}. new_dzh(Name) -> #dzh_info{name=Name}. get_dzh_name(R) -> #dzh_info{name=Name} = R, Name.
测试结果16> c("/home/dzh/lx/erlang/t_records", [{outdir, "/home/dzh/lx/erlang/"}]). c("/home/dzh/lx/erlang/t_records", [{outdir, "/home/dzh/lx/erlang/"}]). {ok,t_records} 17> m(t_records). Module t_records compiled: Date: January 2 2012, Time: 21.28 Compiler options: [export_all,{outdir,"/home/dzh/lx/erlang/"},export_all] Object file: /home/dzh/lx/erlang/t_records.beam Exports: get_dzh_name/1 module_info/0 module_info/1 new_dzh/0 new_dzh/1 ok 18> X1 = t_records:new_dzh(). {dzh_info,dzh,27} 19> X2 = t_records:new_dzh(daizhong). {dzh_info,daizhong,27} 20> Name = t_records:get_dzh_name(X2). daizhong 21>
*记录在shell中的命令
--rr(记录定义文件) %% 加载记录定义
--rf(记录名) %% 删除记录定义
终端示例22> rr("records.hrl"). [dzh_info,todo] 23> X3 = #dzh_info{}. #dzh_info{name = dzh,age = 27} 24> rf(dzh_info). ok 25> X4 = #dzh_info{}. * 1: record dzh_info undefined
注,shell的详细内容见http://www.erlang.org/doc/man/shell.html
*总结
---在运行时是没有记录的概念的,记录的实例就是元组.所以我觉得记录属于编译时的一种机制,有助于编写更加灵活的程序.