在命名变量时添加参数

时间:2010-11-29 23:34:54

标签: erlang

我想为每个识别号码创建一个字典。

传入的论据可能是例如{Id, Key, Value}

我想通过将Id附加到前缀来创建新词典,例如Dict

然后我想使用dict:store(Key, [Value], oldDict)

将密钥写入dict

此时Value是一个队列,所以我先读取队列并添加到队列然后写回字典。

我的问题是Id如何附加到前缀?

2 个答案:

答案 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)

您正在寻找类似printf的机制

可以使用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.

我没有测试代码,这只是让你知道我的建议。