我在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?
答案 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的性质,在上面的示例中,我选择在列表理解中使用乐趣。
那应该是诀窍!