【发布时间】:2011-04-18 21:38:38
【问题描述】:
我发现了 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.
但是,在 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调用,您可以轻松地使用服务器的状态。 -
我已经错过了 PHP... static $i; $i++;
标签: erlang