如何在Erlang中将元组对列表转换为记录?
假设我有这个: -record(my_record, {foo, bar, baz}). Keyvalpairs = [{foo, val1}, {bar, val2}, {baz, val3}]. Foorecord = #my_record{foo=val1, bar=val2, baz=val3}. -记录(我的记录,{foo,bar,baz})。 Keyvalpairs=[{foo,val1}, {bar,val2}, {baz,val3}]。 Foorecord=#my_record{foo=val1,bar=val2,baz=val3}。如何在Erlang中将元组对列表转换为记录?,erlang,Erlang,假设我有这个: -record(my_record, {foo, bar, baz}). Keyvalpairs = [{foo, val1}, {bar, val2}, {baz, val3}]. Foorecord = #my_record{foo=val1, bar=val2, baz=val3}. -记录(我的记录,{foo,bar,baz})。 Keyvalpairs=[{foo,val1}, {bar,val2}, {b
如何将Keyvalpairs转换为Foorecord?最简单的方法是:
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)]]).
Foorecord=list_to_tuple([my_record |[proplist:get_value(X,Keyvalpairs)
||X如果值的顺序与记录中的顺序相同,则可以直接转换为记录,只需在列表第一个元素的记录名称之前,然后将列表转换为元组
Foorecord = list_to_tuple([my_record]++[Val || {_,Val} <- [{foo, val1},{bar, val2},{baz, val3}] ]).
Foorecord=list_to_tuple(+[my_record]+[Val |{{},Val}正如其他答案所指出的那样,您需要使用自己的解决方案来实现这一点。但是,建议的解决方案并不完整。例如,它不考虑记录项的默认值。我使用以下代码段来处理此转换:
%% @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应用程序时的工作更轻松: