我想为每个识别号码创建一个字典。
传入的论据可能是例如{Id, Key, Value}
我想通过将Id
附加到前缀来创建新词典,例如Dict
然后我想使用dict:store(Key, [Value], oldDict)
此时Value
是一个队列,所以我先读取队列并添加到队列然后写回字典。
我的问题是Id如何附加到前缀?
答案 0 :(得分:2)
那是不可能的,对不起。
在Erlang中,您无法在运行时附加名称†。您唯一的选择是将所有词典存储在另一个词典中并传递它。
为了将静态标识符(D)和数字粘合在一起,Erlang为您提供了许多可能性。最简单的方法是构造一个元组{d, ID}
并将其作为关键字。
您还可以使用下面描述的任何字符串连接方法。
既然你已经澄清了你的问题,我原来的大多数解释都失去了背景。无论如何,我将他们留在这里。
这很简单,只需使用:
"D" ++ integer_to_list(SomeID)
Erlang是一种功能语言,因此破坏性地修改字典是不可能的。
假设您在变量Dict
中存储了dictionary,并且SomeID
设置为3。
您可以使用以下内容获取Dict
的副本,其中“D3”设置为Value
:
NewDict = dict:store("D" ++ integer_to_list(SomeID), Value, Dict)
可以使用Erlang函数io_lib:format(FmtString, Args)
。与printf
不同,格式化指令以代字符开头。
您可以查找正确的指令in the manual,但是为了向字符串"D"
添加整数,调用将如下所示:
io_lib:format("D~b", [SomeID])
Gotcha :io_lib:format/2
会返回一个深层字符列表。如果您想要一个平面列表,请在结果上使用lists:flatten/1
。你可以在Erlang shell中试试这个:
(b@frog)1> SomeID = 3.
3
(b@frog)2> io_lib:format("D~b", [SomeID]).
[68,"3"]
(b@frog)3> lists:flatten(io_lib:format("D~b", [SomeID])).
"D3"
<小时/> †实际上,你可以使用流程词典来做到这一点。别!你将失去正确的能力 测试和调试你的程序(除了下地狱)。
答案 1 :(得分:0)
Erlang中的dict
结构不允许您为其命名。在dict
中有一个名字可能毫无意义。 dict
仅仅是键/值字典,其表示未定义。
如果您想要引用多个词典,那么将它们存储在记录或元组中可能是个好主意,以“命名”它们。您不应该使用函数参数创建变量名。
{my_dict, Dict}
#state{
my_dict = Dict
}
假设您需要将字典名称作为d_mycustomname,您可以编写如下内容:
atomize(Name) ->
list_to_atom("d_" ++ Name).
与其他受访者一样,我不确定这正是您所要求的。请重新制定您的问题以获得更好的答案。我在这一点上的答案只是猜测 - 由酒精驱动。
您的更新后:
关于向字典添加值的方式,您想要的可能是update
而不是store
操作。
enqueue(D, {_Id, Key, Value}) ->
Update = fun (Old) -> Old ++ [Value] end,
dict:update(Key, Update, [Value], D).
这会将您的值附加到“队列”。如果还没有,它将创建一个。
关于带前缀的名称,您可以将词典存储在一个支持列表中:
enqueue(ListOfDicts, {Id, Key, Value}) ->
Name = "dict_" ++ Id,
case proplists:get_value(Name, ListOfDicts) of
undefined -> % No such a dict yet
[{Name, dict:new()}|ListOfDicts];
D ->
Update = fun (Old) -> Old ++ [Value] end,
NewD = dict:update(Key, Update, [Value], D),
lists:keyreplace(Name, 1, ListOfDicts, {Name, NewD})
end.
我没有测试代码,这只是让你知道我的建议。