0

たとえば、次のようなタプルのリストがあります。

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

私の関数の1つは、リストを調べて、次のようにキーで要素を返すことになっています:

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/3またはを使用しproplists:get_value/2,3ます。

lists:keyfind/3このタスクに最適なオプションですproplistsこれはBIFであり、Cで記述されています。モジュールやその他のpure-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を使用して2つを混合することもでき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)->
    ケースproplists:get_value(Key、Proplist)of
        未定義->{エラー、不明};
        値->{ok、Value}
    終わり。

于 2013-01-19T09:30:03.057 に答える