2009-05-16 4 views

Antwort

17

Die einfachste, was zu tun ist:

Foorecord = #my_record{foo=proplists:get_value(foo, Keyvalpairs), 
     bar=proplists:get_value(bar, Keyvalpairs), 
     baz=proplists:get_value(baz, Keyvalpairs)}. 

Wenn dies zu repetitiv ist man so etwas tun können:

Foorecord = list_to_tuple([my_record|[proplists:get_value(X, Keyvalpairs) 
     || X <- record_info(fields, my_record)]]). 
0

Wenn Sie die Werte in der gleichen Reihenfolge wie in der Aufzeichnung haben, Sie können direkt in den Datensatz konvertieren, Sie müssen nur den Namen des Datensatzes am ersten Element der Liste voranstellen und dann die Liste in ein Tupel konvertieren.

Foorecord = list_to_tuple([my_record]++[Val || {_,Val} <- [{foo, val1},{bar, val2},{baz, val3}] ]). 
3

Wie die anderen Antworten darauf hinweisen, müssen Sie Ihre eigene Lösung rollen, um dies zu erreichen. Die vorgeschlagenen Lösungen sind jedoch unvollständig. Beispielsweise werden Standardwerte für Datensatzeinträge nicht berücksichtigt. Ich verwende den folgenden Code-Schnipsel der diese Umwandlung zu nehmen:

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

Nun kann man einfach tun:

-record(frob, {foo, bar="bar", baz}). 

to_rec(?RECSPEC(frob), [{baz, "baz"}, {foo, "foo"}]) 

die liefert

#frob{foo="foo", bar="bar", baz="baz"} 

ich diese in ein kleines setzen „Toolbox "Bibliothek, die ich baue, um diese kleinen" Schnipsel "zu sammeln, die das Leben bei der Entwicklung von Erlang-Anwendungen erleichtern: ETBX