Tôi đã tìm ra Erlang kiểu bẹ: đuôi-đệ quy với các chức năng mà phải mất tất cả các "biến không thay đổi":Đếm trong Erlang (? Làm thế nào để tăng một biến)
%% 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.
Nhưng cách tốt nhất để tăng số lượt truy cập trong Erlang là gì? Trong hầu hết các ngôn ngữ lập trình, cách bạn đếm mọi thứ bằng cách tăng một biến (ví dụ: count += 1;
). Biến của Erlang không thay đổi, vì vậy chúng ta phải sáng tạo. May mắn thay, chúng tôi có các tùy chọn ...
Chúng tôi có thể chuyển biến Số lượt truy cập với các chức năng của chúng tôi và tăng biến đó với mỗi lệnh gọi hàm. Chúng tôi có thể sử dụng từ điển quy trình để lưu trữ số lượng và get
và put
để tăng số lượng từ điển đó. Chúng tôi có thể sử dụng ETS, lưu trữ dữ liệu cục bộ cho các quy trình. Chúng tôi có thể sử dụng quy trình truy cập (!!!):
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.
Tôi chắc chắn cũng có những cách khác, tùy thuộc vào phạm vi. Những gì được coi là "thực hành tốt nhất" để tăng một biến trong Erlang?
Câu hỏi này không quá có ý nghĩa nếu không có trường hợp sử dụng. Bạn có thể làm 'danh sách: foldl' để đếm những thứ trong một danh sách (hoặc' filter' + 'length'). Nếu bạn đang đếm các cuộc gọi 'gen_server', bạn làm điều đó với trạng thái máy chủ của bạn một cách dễ dàng. – Dustin
Tôi đã thiếu PHP ... tĩnh $ i; $ i ++; – Rolf