8

我是 Erlang 的新手,也许我只是错过了教程中的这个问题,尽管它很简单。假设,我有一个从 erlang:fun_info/1 获得的 {Key, Value} 对列表。我想知道函数的数量,列表的其余部分对我不感兴趣。所以我写了类似的东西:

find_value( _, [] ) ->
    nothing;
find_value( Key, [{Key, Value} | _] ) ->
    Value;
find_value( Key, [_ | T] ) ->
    find_value( Key, T).    

然后做:

find_value( arity, erlang:fun_info( F )).

我工作得很好,但是像 find_value 这样的东西应该是一个太常见的例程来编写它吗?我没能在 BIF 中找到它的类似物。所以问题是:有一种很好的优雅方法可以从 {key, value} 元组列表中获取键的值吗?

4

5 回答 5

12

该模块proplists包含get_value/2,这应该是您想要的。

于 2012-06-03T12:15:48.013 回答
10

lists:keyfind/3做这个。在这里,我已将其映射到您的find_value/2界面中:

find_value(Key, List) ->
    case lists:keyfind(Key, 1, List) of
        {Key, Result} -> Result;
        false -> nothing
    end.

不过, proplists可能是一条更好的路线。

于 2012-06-03T12:27:16.260 回答
4

由于 lists:keyfind/3 已经发布,我将提到另一个有用的选项,使用列表推导:

hd([ Value || {arity, Value} <- List ]).

这意味着获取所有值,使得每个元素都是“Value”,并且来自与 List 中的 {arity, Value} 匹配的元组。由于列表推导返回一个列表,我们得到该列表的头部。

并有趣地使用它:

1> List=[{a,1},{b,2},{c,3}].
[{a,1},{b,2},{c,3}]
2> F=fun(What, List) -> hd([ Value || {Key, Value} <- List, Key =:= What]) end.
#Fun<erl_eval.12.82930912>
3> F(c, List).
3
于 2012-06-03T14:13:03.433 回答
2

proplists:get_value如果您不关心速度,则可以这样做

lists:keyfind它是性能的最佳选择,因为它是 BIF。你可以像这样用element/2包装它

element(2, lists:keyfind(K, 1, L))

你会得到与 proplists:get_value 相同的结果,但速度更快。

资料来源: http ://www.ostinelli.net/erlang-listskeyfind-or-proplistsget_value/

于 2015-06-12T21:15:20.863 回答
1
find(K, [H|T]) ->
    case H of
        {K, V} -> V;
        _ -> find(K, T)
    end;
find(_, []) -> none.
于 2016-02-06T18:29:08.287 回答