gpt4 book ai didi

erlang - 在 Erlang 中计数(如何递增变量?)

转载 作者:行者123 更新时间:2023-12-02 01:38:21 26 4
gpt4 key购买 nike

我已经弄清楚了 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 变量,并在每次函数调用时递增它。我们可以使用进程字典来存储计数,并使用 getput 来递增计数。我们可以使用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 中增加变量的“最佳实践”是什么?

最佳答案

不要使用进程字典。

您所期望的“正常”循环(即 for 循环或 do while)通常是在 Erlang 中的递归函数中实现的,因此如果您要递增“正常”计数器在函数调用中执行此操作,就像您显示在顶部一样。

不要使用进程字典。

如果您错过了,我可以指出您不应该使用进程字典吗?

关于erlang - 在 Erlang 中计数(如何递增变量?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3823198/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com