代码之家  ›  专栏  ›  技术社区  ›  clofresh

如何在Erlang中将元组对列表转换为记录?

  •  4
  • clofresh  · 技术社区  · 17 年前

    假设我有这个:

    -record(my_record, {foo, bar, baz}).
    
    Keyvalpairs = [{foo, val1},
                   {bar, val2},
                   {baz, val3}].
    
    Foorecord = #my_record{foo=val1, bar=val2, baz=val3}.
    

    如何将Keyvalpairs转换为Foorecord?

    3 回复  |  直到 17 年前
        1
  •  18
  •   cthulahoops    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)]]).
    
        2
  •  3
  •   erick    13 年前

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

        3
  •  0
  •   ramontiveros    15 年前

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