我什么时候应该使用进程范围的字典?何时我的进程状态应该在循环函数的参数中?
这个:
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作为参数?这两个世界中最好的还是最差的?
我建议您使用记录来存储循环数据.这样,如果您需要在循环数据中添加新的"变量",您只需将其添加到记录中,而不会触及任何子句.如果您的"密钥"最近发生变化,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)