我已经找到了Erlang风格的循环:带有函数的尾递归,这些函数可以获取所有"不变的变量":
%% does something, 80 bytes at a time
loop(Line, File) -> loop(Line, File, 0).
loop(Line, File, Count) ->
do_something(Line, Count),
case file:read(File, 80) of
{ok, Line2} -> loop(Line2, File, Count + 1);
eof -> file:close(File);
{error, Reason} -> {error, Reason}
end.
Run Code Online (Sandbox Code Playgroud)
但是,在Erlang中增加计数器的最佳方法是什么?在大多数编程语言中,计算事物的方式是通过递增变量(即.count += 1;
).Erlang的变量没有变化,因此我们必须具有创造性.幸运的是,我们有选择......
我们可以使用函数传递Counter变量,并在每次函数调用时递增它.我们可以使用进程字典来存储计数,get
并将put
其递增.我们可以使用ETS,即进程的本地数据存储.我们可以使用柜台流程(!!!):
loop(Count) ->
receive
{ incr } ->
loop(Count + 1);
{ report, To } ->
To ! { count, Count },
loop(Count)
end.
incr(Counter) ->
Counter ! { incr }.
get_count(Counter) ->
Counter ! { report, self() },
receive
{ count, Count } -> Count
end.
Run Code Online (Sandbox Code Playgroud)
我确信还有其他方法,具体取决于范围.什么被认为是在Erlang中增加变量的"最佳实践"?
Gor*_*rie 10
不要使用流程字典.
您期望的"正常"循环(即for
循环或a do while
)通常在Erlang中的递归函数中实现,因此如果您正在递增"正常"计数器,请在函数调用中执行此操作,就像您显示顶部一样.
不要使用流程字典.
如果您错过了,我可以指出您不应该使用流程词典.
这完全取决于您使用计数器的目的。任何全局的东西,比如 q 系统处理的消息数量,都应该使用 ets:update_counter。如果它不是全局的,我通常只是将其包含在您所示的参数中。
归档时间: |
|
查看次数: |
10872 次 |
最近记录: |