erlang:区分支持者与支持者名单

Yak*_*kov 1 erlang key list

我写了一个函数,它获得proplists或者list是proplists和key.如果输入是proplists我只是proplists:get_value用来找到与key对应的值.但如果输入是支持者列表,我需要迭代其所有元素.并在每个人中寻找钥匙.我amnot知道如何区分listsproplists.两者的lists:is_list回报true......

Ste*_*ski 5

proplist具有元组或原子的元素.如果您的案例的列表参数的第一个元素是其中之一,则您有一个proplist,否则您有一个proplists列表.例如,此代码将返回为给定键找到的值或值列表:

get_value(_Key, []) -> undefined;
get_value(Key, [KV|_]=PL) when is_tuple(KV); is_atom(KV) ->
    proplists:get_value(Key, PL);
get_value(Key, List) when is_list(List) ->
    [get_value(Key, V) || V <- List].
Run Code Online (Sandbox Code Playgroud)

这是一些示例输出:

2> pl:get_value(foo, []).
undefined
3> pl:get_value(foo, [{foo,bar}]).
bar
4> pl:get_value(foo, [[{foo,bar}]]).
[bar]
5> pl:get_value(foo, [[{foo,bar}],[foo],[{foo,baz}]]).
[bar,true,baz]
Run Code Online (Sandbox Code Playgroud)

请注意,在最后一种情况下,第二个参数中的中间proplist只有一个键作为原子,没有关联的值,因此它在返回列表中的值是true.