2010-06-04 14 views
2

Je souhaite créer un enregistrement à partir d'une liste d'attributs - pas la proplist proprement dite, mais par exemple des attributs #xmlElement. J'ai une liste d'éléments que je dois traiter et une liste d'attributs possibles.Création d'un enregistrement à partir d'une liste de propriétés

je pouvais bien sûr faire quelque chose comme:

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

Mais cela va être un peu long et je l'ai déjà la liste des attributs possibles (je pourrais même utiliser record_info(fields, blah) Je vois beaucoup de façons folles. de le faire avec l'accès au tuple d'enregistrement réel avec setElement, mais peut-être il y a une solution plus simple

Répondre

2

je serais probablement plus tenté par:

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

Le but de transformer cette chose en un enregistrement est probablement d'obtenir une vérification statique des attributs à la compilation ailleurs dans votre code, donc je ne pense pas qu'il y ait de mal à être simple et un peu répétitif ici.

Si vous voulez, la magie record_info est assez simple, mais rappelez-vous que record_info n'est pas une fonction réelle donc cette fonction ne peut pas être générique. (Une macro pourrait l'être.)

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

Si vous voulez vraiment des clés dynamiques à l'exécution, utilisez un dict.

3

On dirait que exprecs est ce que vous cherchez:

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

lecture de la description:

Le module est un Parse transform vous permettant d'exporter des enregistrements. La transformation ajoute des fonctions d'accès pour instancier, inspecter et modifier des enregistrements, sans avoir à introduire des dépendances de compilation entre les modules.

Voir si cela aide.