处理字典或循环参数?

Tho*_*mas 3 erlang

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

这个:

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

或这个:

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

循环函数的参数具有明确的好处,因为它之外的任何东西都不能改变参数(除非你在另一个函数上做奇怪的魔法弹跳,比如蹦床),但是状态倾向于加起来,以及它们的参数.

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

Zed*_*Zed 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.
Run Code Online (Sandbox Code Playgroud)