我有一个元组列表,如下所示:
[{apple, fruit},{pear, fruit},{tomato, vegetable}]
Run Code Online (Sandbox Code Playgroud)
我的一个函数应该通过列表并按键返回一个元素,如下所示:
1> db:find(pear, Db).
{ok,fruit}
Run Code Online (Sandbox Code Playgroud)
我的功能是这样的,看起来像这样:
find(Key, DbRef) -> [{ok, Element} || {Key1, Element} <- DbRef, Key =:= Key1].
Run Code Online (Sandbox Code Playgroud)
但我也希望它返回这样的东西:
2> db:find(cucumber, Db).
{error,unknown}
Run Code Online (Sandbox Code Playgroud)
在列表中找不到密钥时.
这可能吗??
小智 6
使用lists:keyfind/3或proplists:get_value/2,3.
lists:keyfind/3是这项任务的最佳选择.它是BIF,因此用C语言编写.它比proplists模块或任何其他纯erlang实现快得多.它还能够处理更复杂的元组,其中的键位于不同的位置(如果你有一个记录列表就是这种情况).
使用lists模块:
{pear, fruit} = lists:keyfind(pear, 1, Db),
false = lists:keyfind(cucumber, 1, Db).
Run Code Online (Sandbox Code Playgroud)
使用proplists模块:
fruit = proplists:get_value(pear, Db),
undefined = proplists:get_value(cucumber, Db),
{error, instance} = proplists:get_value(cucumber, Db, {error, instance}).
Run Code Online (Sandbox Code Playgroud)
甚至将两者混合,用proplists风格keyfind:
get_value(Key, List) -> get_value(Key, List, undefined).
get_value(Key, List, Default) ->
case lists:keyfind(Key, 1, List) of
false -> Default;
{Key, Value} -> Value
end.
Run Code Online (Sandbox Code Playgroud)
用法:
fruit = get_value(pear, Db),
undefined = get_value(cucumber, Db),
{error, instance} = get_value(cucumber, Db, {error, instance}).
Run Code Online (Sandbox Code Playgroud)