Как и в других ответах, вам нужно найти собственное решение для достижения этой цели. Предлагаемые решения, однако, являются неполными. Например, он не учитывает значения по умолчанию для записей записей. Я использую следующий фрагмент кода, чтобы позаботиться об этом преобразовании:
%% @doc returns a "RECSPEC" that can be used by to_rec in order to
%% perform conversions
-define(RECSPEC(R), {R, tuple_to_list(#R{}), record_info(fields, R)}).
%% @doc converts a property list into a record.
-spec to_rec(recspec(), proplist()) -> record().
to_rec({R, [_ | N], Spec}, P) when is_atom(R) and is_list(Spec) ->
list_to_tuple(
[R | lists:foldl(
fun ({K,V}, A) ->
case index_of(K, Spec) of
undefined ->
A;
I ->
{Head, Tail} = lists:split(I, A),
Rest = case Tail of
[_ | M] -> M;
[] -> []
end,
Head ++ [V | Rest]
end
end, N, P)]).
Теперь можно просто сделать:
-record(frob, {foo, bar="bar", baz}).
to_rec(?RECSPEC(frob), [{baz, "baz"}, {foo, "foo"}])
, что дает
#frob{foo="foo", bar="bar", baz="baz"}
Я поместил это в небольшую библиотеку «инструментов», которую я собираю, чтобы собрать эти маленькие «фрагменты», которые просто облегчают жизнь при разработке приложений на Erlang: ETBX