我正在使用 ETS 制作银行账户管理系统,该系统还将持有活期账户和储蓄账户,我无法弄清楚如何生成和保留一系列帐号,因为 erlang 变量是不可变的。
那么如何实现生成和保存帐号的功能,以便下次创建帐户时将下一个帐号分配给前一个帐号?
我正在使用 ETS 制作银行账户管理系统,该系统还将持有活期账户和储蓄账户,我无法弄清楚如何生成和保留一系列帐号,因为 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递增/分配它。