0

ネストされたレコードの構造を proplist との間で変換する方法がわかりません。以下を使用して、個々のレコードを proplist に変換できます。

lists:zip(record_info(fields,typea), tl(tuple_to_list(Atypea))).

ただし、レコードの構造に次のような他のレコードのリストが含まれている場合、これは明らかに失敗します。

-record(typec, {
  id = 0,
  name = <<"typec">>,
 })

-record(typeb, {
  id = 0,
  name = <<"typeb">>,
  typec_list = [],
 }).

-record(typea, {
  id = 0,
  name = <<"typea">>,
  typec_list = [],
  typeb_list = [],
 }).

どうすればこれを達成できるか考えてください。

4

2 に答える 2

2

filmor によって与えられたソリューションのバリエーションは次のとおりです。

to_proplist(Record) ->
    to_proplist(Record,[]).


to_proplist(Type = #typea{}, []) ->
    lists:zip(record_info(fields, typea), to_list(Type));

to_proplist(Type = #typeb{}, []) ->
    lists:zip(record_info(fields, typeb), to_list(Type));

to_proplist(Type = #typec{}, []) ->
    lists:zip(record_info(fields, typec), to_list(Type));

to_proplist([NotAType | Rest], Res) ->
    to_proplist(Rest, [to_proplist(NotAType,[])| Res]);

to_proplist([], Res) ->
    lists:reverse(Res);

to_proplist(Val, []) ->
    Val.


to_list(Type) ->
    [to_proplist(L,[]) || L <- tl(tuple_to_list(Type))].

これは、レコードのすべての組み合わせで機能します。case 句を追加することによってのみ、追加のレコードをサポートできます。例:

to_proplist(Type = #typed{}, []) ->
        lists:zip(record_info(fields, typed), to_list(Type));
于 2013-09-21T09:03:44.160 に答える