当座預金口座と普通預金口座も保持する ETS を使用して銀行口座管理システムを作成していますが、erlang 変数は不変であるため、一連の口座番号を生成して保持する方法がわかりません。
では、アカウント番号を生成して保存する関数を実装して、次回アカウントが作成されたときに次のアカウント番号を前のアカウント番号に割り当てるにはどうすればよいでしょうか?
当座預金口座と普通預金口座も保持する ETS を使用して銀行口座管理システムを作成していますが、erlang 変数は不変であるため、一連の口座番号を生成して保持する方法がわかりません。
では、アカウント番号を生成して保存する関数を実装して、次回アカウントが作成されたときに次のアカウント番号を前のアカウント番号に割り当てるにはどうすればよいでしょうか?
上記の回答は、アカウント番号の割り当てを管理するプロセスを使用した非常に機能的なアプローチを説明しています。純粋に機能的ではありませんが、パフォーマンスが向上する別の方法は、既に使用していると言った ets フレームワークを活用することです。次のアカウント番号を ets テーブルに入れ、ets:update_counter/3でインクリメント/割り当てます。
現在の番号をその状態で保持するプロセスを作成できます。次の番号を取得するには、そのプロセスにメッセージを送信する必要があり、次の番号を返し、その状態で保存します。これは、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().