Erlang获取record信息

Erlang中的record在编译时会转换为tuple,如 -record(test,{id = 1,name = “test”}),编译后会转换为{test,1,”test”}。在项目中无法动态获取record的字段定义,如果想获得record中的定义,可通过record_fields/1接口获得,但参数只能是atom,不能为变量。record_fields/1在编译时已经生成record字义信息。

有一个折衷的方法,项目中可以动态获得record字义。github上有个开源项目dynarec,在编译时生成record信息的接口函数,
https://github.com/kqqsysu/dynarec

dynarec会在编译时生成导出record信息的相关函数,需要模块中添加编译选项:”-compile({parse_transform, dynarec}).”,它会生成下面的函数

 

如下面的例子,test_record.erl

需要预先把编译 dynarec.erl编译好,再编译test_record.erl
erlc dynarec.erl
erlc test_record.erl -pa ./

m(test_record).可以看到,模块test_record多了get_value/2,set_value/2,records/0,fields/1,new_record/1 五个函数导出。
20141110172834
test_record:records/0返回了所有的的record列表,
[test1,test2]

test_record:records/1,返回要查询的record字段列表。

由于test_record中的record信息也是编译时生成的,所以record变化时,test_record也需要重新编译。但dynarec已经很大情度上方便了我们获取record的定义。

如在数据持久化、协议通信等的都可以利用dynarec项目自动生成代码。

Erlang技术分享内容均为原创,转载请标明本文地址
本文链接:http://www.kongqingquan.com/archives/178

此条目发表在Erlang分类目录,贴了, 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">