处理字典或循环参数?

时间:2009-11-03 18:39:44

标签: erlang

我什么时候应该使用进程范围的字典?何时我的进程状态应该在循环函数的参数中?

此:

loop() ->
  receive
     {From, subscribe} ->
       put(listeners, [From|get(listeners)]),
       ?MODULE:loop()
  end.

或者这个:

loop(Listeners) ->
  receive
    {From, subscribe} ->
       ?MODULE:loop([From|Listeners])
  end.

循环函数的参数具有明确的好处,因为它之外没有任何东西可以改变参数(除非你在蹦床等另一个函数上做奇怪的魔法弹跳),但状态往往会加起来,参数和他们一起。

dict如何作为参数?这两个世界中最好的还是最差的?

3 个答案:

答案 0 :(得分:8)

我建议您使用记录来存储循环数据。这样,如果您需要在循环数据中添加新的“变量”,您只需将其添加到记录中,而不会触及任何子句。如果您的“密钥”最近发生变化,Dict只会是更好的选择,这在循环数据的情况下是不可能的。

-record(state, {
           listeners = [],
           new_var   = undefined,
           new_var2  = ""
           ...
        }).

init() ->
  loop(#state{}).

loop(State) ->
  receive
    {From, subscribe} ->
       loop(State#state{listeners = [From|State#state.listeners]});
    somethingelse ->
       do_nothing(),
       loop(State)
  end.

答案 1 :(得分:2)

使用流程词典的主要缺点与可能的副作用有关:当您开始大量使用流程词典时,您将更难以跟踪可能的副作用。

例如,假设您处于函数“X”并开始从流程字典中提取数据,那么您实际上是在反对Erlang的功能性。

但是,嘿,在某些时候你需要访问更大的数据存储,不是吗?重点是:尝试尽可能多地隔离进程字典。

答案 2 :(得分:1)

使用进程字典的另一个主要缺点是,当您拥有的数据未通过函数调用传入时,进行跟踪会变得更加困难。