Ho capito lo stile di Erlang loop: coda ricorsione con funzioni che prendono tutte le "variabili che non variano":Conteggio in Erlang (? Come faccio a incrementare una variabile)
%% 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.
Ma qual è il modo migliore per incrementare un contatore in Erlang? Nella maggior parte dei linguaggi di programmazione, il modo in cui conti le cose è incrementando una variabile (ad esempio count += 1;
). Le variabili di Erlang non variano, quindi dobbiamo essere creativi. Fortunatamente, abbiamo opzioni ...
Possiamo passare una variabile Contatore con le nostre funzioni e incrementarla con ogni chiamata di funzione. Possiamo usare il dizionario di processo per memorizzare un conteggio e get
e put
per incrementarlo. Possiamo utilizzare ETS, l'archiviazione locale dei dati per i processi. Possiamo usare un contro processo (!!!):
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.
Sono sicuro che ci sono anche altri modi, a seconda dello scopo. Cosa è considerato "migliore pratica" per incrementare una variabile in Erlang?
Questa domanda non è troppo significativa senza un caso d'uso. Puoi fare 'liste: foldl' per contare le cose in una lista (o' filter' + 'length'). Se contate le chiamate 'gen_server', lo fate con lo stato del vostro server facilmente. – Dustin
Mi manca già PHP ... statico $ i; $ i ++; – Rolf