如何在Erlang中创建变量+通配符dict:fetch

时间:2011-06-17 22:26:38

标签: dictionary erlang

我在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])).

我想更新某个键值对并将一些新数据插入'key'元组(而不是'value'列表):

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行,Erlang说变量“_”是未绑定的。

如果密钥是元组,我似乎无法通过仅提供密钥的一部分来获取值。这是真的吗?

实际上是否可以更新字典中的密钥?

有没有更短的方法来做而不是做1,2和3?

2 个答案:

答案 0 :(得分:1)

dict不支持你想做的事。您必须知道密钥,擦除旧密钥/值对,并存储新密钥。

看看ets。您可以使用ets:match查找符合您规范的密钥。你仍然需要删除旧的键/值对并插入一个新的键。

答案 1 :(得分:-1)

如果您坚持更新字典中的密钥而不删除密钥并稍后存储新值,我建议您首先将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(),这更容易操作Key或值。您可以使用任何方法,例如,使用几个子句递归,其中模式匹配您想要操作的Key的性质,在上面的示例中,我选择在列表理解中使用乐趣。 那应该是诀窍!