如何处理erlang中的帐号?

时间:2013-05-19 23:22:34

标签: functional-programming erlang ets

我正在使用ETS制作银行账户管理系统,该系统还将持有当前和储蓄账户,我无法弄清楚如何生成和保留一系列账号,因为erlang变量是不可变的。

那么如何实现生成和保存帐号的功能,以便下次创建帐户时,它会将下一个帐号分配给前一个帐号?

2 个答案:

答案 0 :(得分:1)

您可以创建一个将当前号码保持在其状态的流程。要获得下一个号码,您必须向该进程发送消息,并返回下一个号码并将其保存在其状态中。这是使用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().

答案 1 :(得分:1)

上述答案描述了一种使用流程管理帐号分配的非常实用的方法。另一种方法,即功能较少但性能较好的方法,是利用您已经使用过的ets框架。将下一个帐号放入ets表并使用ets:update_counter/3递增/分配。