我正在使用ETS的銀行賬戶管理系統,它也將持有當前和儲蓄賬戶,我無法弄清楚,我怎樣才能生成和保留一系列賬戶號碼,因爲erlang變量是不可變的。如何處理erlang中的帳號?
那麼如何實現一個函數來生成並保存帳號,以便下次創建帳號時,它會將下一個帳號分配給上一個帳號?
我正在使用ETS的銀行賬戶管理系統,它也將持有當前和儲蓄賬戶,我無法弄清楚,我怎樣才能生成和保留一系列賬戶號碼,因爲erlang變量是不可變的。如何處理erlang中的帳號?
那麼如何實現一個函數來生成並保存帳號,以便下次創建帳號時,它會將下一個帳號分配給上一個帳號?
您可以創建一個將當前編號保持在其狀態的進程。要獲得下一個號碼,您必須向該流程發送消息,並返回下一個號碼並將其保存在其狀態中。這是實現的示例與gen_server:
-module(acc_number).
-behavior(gen_server).
-export([start_link/0, get_number/0]).
-export([init/1, handle_call/3]).
-define(SERVER, ?MODULE).
-record(state, {number}).
start_link() ->
gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
get_number() ->
gen_server:call(?SERVER, get_number).
init([]) ->
{ok, #state{number = 0}}.
handle_call(get_number, _From, #state{number = Number}) ->
NextNumber = Number + 1,
{reply, NextNumber, #state{number = NextNumber}}.
注:在例子中,我實現的只有那些用來解決任務的回調。你必須實現gen_server的所有回調。
那麼獲得下一個號碼,你可以做這樣的事情:
acc_number:start_link().
AccountNumber = acc_number:get_number().
以上回答描述了使用一個過程來管理賬號分配一個非常實用的方法。另一種不太純粹的功能但性能更好的方法是利用您所說的已經使用的ets框架。將下一個帳號放入ets表中並用ets:update_counter/3增加/分配它。
你是否看到這篇文章http://spawnlink.com/articles/tag/erlybank/index.html – ymn
你有沒有試過使用'lists','processes','mnesia','tuples',.. e.t.c。在這裏看到更多:http://learnyousomeerlang.com/content –