Подсчет в 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.

Но как лучше всего увеличить счетчик в Эрланг? В большинстве языков программирования подсчет производится путем увеличения переменной (например, 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?

7
задан mit 10 August 2012 в 19:22
поделиться