2010-06-04 84 views
2

我想从属性列表创建记录 - 不是实际的列表,而是例如#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

我可能是最被诱惑?

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)]]). 

如果你真的想在运行时动态密钥,然后用字典。

3

这听起来像exprecs是你在找什么:

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

从描述阅读:

该模块是解析变换 让您导出记录。 变换为 实例化,检查和 添加访问器函数,而不必 在模块之间引入编译时相关性 。

看看这是否有帮助。