Создание записи из списка свойств - PullRequest
2 голосов
/ 05 июня 2010

Я хотел бы создать запись из списка атрибутов - не фактического проплиста, а, например, из #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 ]

3 голосов
/ 05 июня 2010

Звучит так, будто вы ищите exprecs:

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

Чтение из описания:

Модуль является преобразованием синтаксического анализа. позволяет вам экспортировать записи. Transform добавляет функции доступа для создание экземпляров, проверка и изменение записей, без необходимости ввести зависимости времени компиляции между модулями.

Посмотрите, поможет ли это.

2 голосов
/ 05 июня 2010

Вероятно, меня больше всего соблазнит:

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.

...