2013-05-19 1 views
0

Je fais un système de gestion de compte bancaire en utilisant ETS qui tiendra également compte courant et d'épargne, je suis incapable de comprendre que comment puis-je générer et conserver la série de numéros de compte puisque les variables erlang sont immuables.Comment puis-je gérer le numéro de compte en erlang?

Alors, comment puis-je implémenter une fonction pour générer et enregistrer le numéro de compte afin que la prochaine fois que le compte est créé, il alloue le numéro de compte suivant à la précédente?

+0

Voyez-vous ces articles http://spawnlink.com/articles/tag/erlybank/index.html – ymn

+0

Avez-vous essayé d'utiliser 'lists',' processes', 'mnesia',' tuples', .. e.ct. voir plus ici: http://learnyousomeerlang.com/content –

Répondre

1

Vous pouvez créer un processus qui conservera le numéro actuel dans son état. Pour obtenir le prochain numéro, vous devez envoyer un message à ce processus et il renvoie le numéro suivant et l'enregistre dans son état. Voilà un exemple de mise en œuvre avec 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}}. 

Remarque: Dans l'exemple que je mis en œuvre que les callbacks qui sont utilisés pour résoudre la tâche. Vous devez implémenter tout le rappel de gen_server.

Donc, pour obtenir le numéro suivant, vous pouvez faire quelque chose comme ceci:

acc_number:start_link(). 
AccountNumber = acc_number:get_number(). 
1

La réponse ci-dessus décrit une approche très fonctionnelle en utilisant un processus pour gérer l'attribution de numéro de compte. Une autre méthode, moins purement fonctionnelle mais avec de meilleures performances, consisterait à tirer parti du cadre ets que vous utilisez déjà. Placez le numéro de compte suivant dans une table ets et augmentez/assignez-le avec ets:update_counter/3.

Questions connexes