如何根据列表中的if元素指定返回值?

Mat*_*röm 0 erlang list

我有一个元组列表,如下所示:

[{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/3proplists: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)