2009-05-16 6 views

答えて

17

最も単純なものは次のとおりです。

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

これはあなたのような何かを行うことができますあまりにも繰り返している場合:あなたは、レコードと同じ順序で値を持っている場合は

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

を、レコードに直接変換することができます。レコードの名前の前にリストの最初の要素を置き、リストをタプルに変換するだけです。

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

他の回答が指摘するように、これを達成するには独自のソリューションをロールバックする必要があります。しかしながら、提案された解決法は不完全である。たとえば、レコード項目のデフォルト値は考慮されません。私は、この変換の世話をするために、次のコードスニペットを使用します。

%% @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

関連する問題