Подсчет в Эрланге (как мне увеличить переменную?)
Я выяснил циклы в стиле Эрланга: хвостовая рекурсия с функциями, которые принимают все «переменные, которые не меняются»:
%% 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.
Но как лучше всего увеличить счетчик в Эрланге? В большинстве языков программирования подсчет вещей происходит путем увеличения переменной (т. Е.count += 1;
). Переменные Эрланга не меняются, поэтому мы должны быть креативными. К счастью, у нас есть варианты ...
Мы можем передавать переменную 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?