Поиск значения в списке {key, value} в Erlang
Я новичок в Erlang, и, возможно, я просто пропустил эту проблему в учебнике, хотя это тривиально. Предположим, у меня есть список пар {Key, Value}, полученных из erlang:fun_info/1. Я хочу знать функцию arity, остальная часть списка меня не интересует. Поэтому я пишу что-то вроде:
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 быть слишком распространенной процедурой для его написания? Однако я не смог найти его аналог в BIFs. Так вопрос: это хороший элегантный способ получить значение для ключа из списка кортежей {key, value}?
5 ответов
модуль proplists
содержит get_value/2
, который должен быть тем, что вы хотите.
lists:keyfind/3
это. Здесь я сопоставил его с вашим find_value/2
интерфейс:
find_value(Key, List) ->
case lists:keyfind(Key, 1, List) of
{Key, Result} -> Result;
false -> nothing
end.
proplists может быть, даже лучший маршрут.
поскольку списки: keyfind / 3 уже были опубликованы, я упомяну еще один полезный вариант, используя списки:
hd([ Value || {arity, 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
proplists: get_value - Это способ сделать это, если вы не заботитесь о скорости
списки:keyfind Это лучший выбор для производительности, так как это BIF. Вы можете wrapit с элемент/2 такой
element(2, lists:keyfind(K, 1, L))
и вы получите тот же результат proplists:get_value, но быстрее.
источник: http://www.ostinelli.net/erlang-listskeyfind-or-proplistsget_value/