我什么时候应该使用进程范围的字典?何时我的进程状态应该在循环函数的参数中?
此:
loop() ->
receive
{From, subscribe} ->
put(listeners, [From|get(listeners)]),
?MODULE:loop()
end.
或者这个:
loop(Listeners) ->
receive
{From, subscribe} ->
?MODULE:loop([From|Listeners])
end.
循环函数的参数具有明确的好处,因为它之外没有任何东西可以改变参数(除非你在蹦床等另一个函数上做奇怪的魔法弹跳),但状态往往会加起来,参数和他们一起。
dict如何作为参数?这两个世界中最好的还是最差的?
答案 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)
使用进程字典的另一个主要缺点是,当您拥有的数据未通过函数调用传入时,进行跟踪会变得更加困难。