从属性列表创建记录

时间:2010-06-04 20:13:05

标签: erlang record

我想从属性列表创建记录 - 而不是实际的proplist,但是例如来自#xmlElement属性。我有一个我需要处理的元素列表和一个可能的属性列表。

我当然可以这样做:

create_record(Rec, [{attr1, Val}|As]) -> create_record(Rec#blah{attr1 = Val}, As);
create_record(Rec, [{attr2, Val}|As]) -> create_record(Rec#blah{attr2 = Val}, As);
...

但是这会有点长,我已经有了可能的属性列表(我甚至可以使用record_info(fields, blah)。我看到很多疯狂的方法来访问带有setelement的实际记录元组,但也许有一个更简单的解决方案?

2 个答案:

答案 0 :(得分:3)

听起来像exprecs就是你要找的东西:

http://forum.trapexit.org/viewtopic.php?p=21790

阅读说明:

  

该模块是一个解析变换   允许您导出记录。该   transform为其添加了访问器功能   实例化,检查和   修改记录,而不必   介绍编译时依赖项   模块之间。

看看这是否有帮助。

答案 1 :(得分:2)

我可能最受诱惑:

create_record(Lst) ->
     #blah{
         attr1=proplists:get_value(attr1, Lst, default_attr1),
         attr2=proplists:get_value(attr2, Lst, default_attr2),
         ...
     }.

将这个东西转换成记录的重点可能是在编译时在代码的其他地方对属性进行静态检查,所以我认为这里没有任何直接和重复的任何伤害。

如果你愿意,record_info魔术很简单,但记住record_info不是真正的函数,所以这个函数不能通用。 (宏可能是。)

make_record(Lst) ->
    list_to_tuple([blah|[proplists:get_value(X, Lst) || X <- record_info(fields, blah)]]).

如果您在运行时确实需要动态密钥,请使用dict。