que he descubierto el estilo de Erlang bucles: cola de recursión con las funciones que toman todas las "variables que no varían":Contar en Erlang (? ¿Cómo incrementar una variable)
%% 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.
Pero, ¿cuál es la mejor manera de incrementar un contador en Erlang? En la mayoría de los lenguajes de programación, la forma en que cuenta las cosas es mediante el incremento de una variable (es decir, count += 1;
). Las variables de Erlang no varían, por lo que debemos ser creativos. Afortunadamente, tenemos opciones ...
Podemos pasar una variable de contador con nuestras funciones, y aumentarla con cada llamada de función. Podemos usar el diccionario de proceso para almacenar un conteo, y get
y put
para incrementarlo. Podemos usar ETS, el almacenamiento de datos local para procesos. Podemos usar un proceso de contador (!!!):
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.
Estoy seguro de que hay otras maneras también, dependiendo del alcance. ¿Qué se considera "mejor práctica" para incrementar una variable en Erlang?
Esta pregunta no es demasiado significativa sin un caso de uso. Puedes hacer 'lists: foldl' para contar cosas en una lista (o' filter' + 'length'). Si está contando las llamadas 'gen_server', puede hacer eso fácilmente con el estado de su servidor. – Dustin
Ya me falta PHP ... estática $ i; $ i ++; – Rolf