我已经想通了二郎神式循环:尾递归与把所有的“变量不改变”功能:计数二郎(?我怎么增加一个变量)
%% 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.
但是,在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.
我确定还有其他方法,具体取决于范围。在Erlang中增加一个变量被认为是“最佳实践”?
没有用例,这个问题不是太有意义。你可以使用'lists:foldl'来计算列表中的东西(或'filter' +'length')。如果你正在计算'gen_server'调用,你可以很容易地使用你的服务器状态。 – Dustin 2010-09-29 18:39:01
我已经失踪PHP ... static $ i; $ i ++; – Rolf 2011-06-18 17:15:34