0

我有一个看起来像这样的元组列表:

[{apple, fruit},{pear, fruit},{tomato, vegetable}]

我的一个函数应该遍历列表并按键返回一个元素,如下所示:

1> db:find(pear, Db).
{ok,fruit}

我的功能是这样做的,看起来像这样:

find(Key, DbRef) -> [{ok, Element} || {Key1, Element} <- DbRef, Key =:= Key1].

但我也希望它返回如下内容:

2> db:find(cucumber, Db).
{error,unknown}

当在列表中找不到密钥时。

这可能吗??

4

3 回答 3

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).

使用proplists模块:

fruit = proplists:get_value(pear, Db),
undefined = proplists:get_value(cucumber, Db),
{error, instance} = proplists:get_value(cucumber, Db, {error, instance}).

甚至将两者与proplists-style混合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.

用法:

fruit = get_value(pear, Db),
undefined = get_value(cucumber, Db),
{error, instance} = get_value(cucumber, Db, {error, instance}).
于 2013-01-18T17:15:59.583 回答
1

您必须递归地向下查看每个元素的列表。如果它有正确的键,那么你返回值,否则你递归地调用自己来查看列表的其余部分。如果您到达终点,那么您知道该元素不存在并且您返回{error,instance}.

于 2013-01-18T17:24:04.537 回答
0

这听起来很简单:

db:find(Key,Proplist)->
    case proplists:get_value(Key,Proplist) 的
        未定义-> {错误,未知};
        价值 -> {ok,价值}
    结尾。

于 2013-01-19T09:30:03.057 回答