Как сделать varibale + подстановочный знак: выборка на Erlang - PullRequest
0 голосов
/ 18 июня 2011

У меня есть следующая структура словаря на Erlang:

Key: {element_name, a, element_type, type_1}

Value: [list].

Dictionary: (({element_name, a, element_type, type_1},[List]), ({element_name, b, element_type, type_2},[List])).

Я хотел бы обновить определенную пару ключ-значение и вставить новые данные в кортеж «ключ» (не в список «значение»):

1. Value_list = dict:fetch({element_name, a, element_type, _}, Dict).
2. Dict2 = dict:erase ({element_name, a, element_type, _}, Dict).
3. Dict3 = dict:store ({element_name, a, element_type, New_type}, Value_list, Dict2). 

Проблема в том, что в строке 1 Эрланг говорит, что переменная "_" не связана.

Кажется, что я не могу получить значение, предоставив только часть ключа, если ключ является кортежем. Это правда?

Возможно ли обновить ключ в словаре?

Есть ли более короткий способ сделать это вместо 1,2 и 3?

Ответы [ 2 ]

1 голос
/ 18 июня 2011

dict не поддерживает то, что вы хотите сделать.вам нужно будет знать ключ, стереть старую пару ключ / значение и сохранить новую.

.вы можете использовать ets: match, чтобы найти ключи, соответствующие вашей спецификации.вам все равно придется удалить старую пару ключ / значение и вставить новую.

0 голосов
/ 20 июня 2011

Если вы настаиваете на обновлении ключа в словаре без его удаления и последующего сохранения нового значения для него, я предлагаю сначала преобразовать ваш Dict в список следующим образом: dict:to_list/1. Рассмотрим этот кусок кода:

Fun_to_match_key = fun({{element_name, a, element_type, _} = Key,Value})-> 
                        %% do some stuff here with the Key and value and assuming
                        %% this fun returns the new Key-Value pair you want
                        New_Key = update_my_key(Key),
                        New_Value = update_my_value_if_need_to(Value),
                        {New_Key,New_Value};
                      (Any)-> Any
                   end,
%% Then in one operation, you convert the dict into a list, apply the 
%% fun above in a list comprehension and convert the list back to a dict

New_dict = dict:from_list([Fun_to_match_key(Key_Value_Pair) || Key_Value_Pair <- dict:to_list(Old_Dict)]),
New_dict.

Преобразование dict в список даст вам proplist(), который намного легче манипулировать либо ключом, либо значением. Вы можете использовать любой метод, скажем, рекурсия с несколькими предложениями, в которых ваш шаблон соответствует природе ключа, которым вы хотите манипулировать, в приведенном выше примере я решил использовать забаву в понимании списка. Это должно сработать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...