實現(xiàn)簡單的bank系統(tǒng) 創(chuàng)建用戶 存錢 取錢
-module(my_bank).
-behaviour(gen_server).
-export([init/1,handle_call/3,handle_cast/2,handle_info/2,terminate/2,code_change/3]).
-export([start/0,stop/0,new_account/1,deposit/2,withdraw/2]).
-define(SERVER,?MODULE).
% 啟動一個名為{local my_bank}本地服務(wù)器, 回調(diào)模塊為my_bank
start() -> gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
% 對遠(yuǎn)程服務(wù)器的調(diào)用 關(guān)閉服務(wù)器 Msg是stop
stop() -> gen_server:call(?MODULE, stop).
% 對遠(yuǎn)程服務(wù)器的調(diào)用 給進程發(fā)送同步消息 Msg是{new,Who}
new_account(Who) -> gen_server:call(?MODULE,{new,Who}).
% 對遠(yuǎn)程服務(wù)器的調(diào)用 給進程發(fā)送同步消息 Msg是{add, Who, Amount}
deposit(Who,Amount) -> gen_server:call(?MODULE,{add, Who, Amount}).
% 對遠(yuǎn)程服務(wù)器的調(diào)用 給進程發(fā)送同步消息 Msg是{remove,Who,Amount}
withdraw(Who,Amount) -> gen_server:call(?MODULE,{remove,Who,Amount}).
%啟動本地服務(wù)器后第一個調(diào)用的回調(diào)模塊方法 返回{ok,State}說明成功啟動服務(wù)器 State為handle_call/3的第三個參數(shù)
init([]) -> {ok,ets:new(?MODULE,[])}.
% handle_call 處理的格式
% spec handle_call(Request, From, Statu) ->
% {reply, Reply, State} |
% {reply, Reply, Statu, Timeout} |
% {noreply, State} |
% {noreply, State, TimeOut} |
% {stop, Reason, Reply, State} |
% {stop, Reason, State}
% 同步的回調(diào)函數(shù) 處理格式{reply, Reply, State}
handle_call({new, Who}, _From, Tab) ->
Reply = case ets:lookup(Tab,Who) of
[] -> ets:insert(Tab,{Who,0}),
{welcome,Who};
[_] -> {Who, you_already_are_a_customer}
end,
{reply, Reply, Tab};
% 同步的回調(diào)函數(shù) 處理格式{reply, Reply, State}
handle_call({add,Who,X}, _From, Tab) ->
Reply = case ets:lookup(Tab, Who) of
[] -> not_a_customer;
[{Who,Balance}] ->
NewBalance = Balance + X,
ets:insert(Tab,{Who,NewBalance}),
{thanks, Who, your_balance_is, NewBalance}
end,
{reply,Reply,Tab};
% 同步的回調(diào)函數(shù) 處理格式{reply, Reply, State}
handle_call({remove, Who, X}, _From, Tab) ->
Reply = case ets:lookup(Tab,Who) of
[] -> not_a_customer;
[{Who,Balance}] when X =< Balance ->
NewBalance = Balance - X,
ets:insert(Tab,{Who,NewBalance}),
{thanks, Who, your_balance_is, NewBalance};
[{Who, Balance}] ->
{sorry, Who, you_only_have, Balance, in_the_bank}
end,
{reply,Reply,Tab};
% 同步的回調(diào)函數(shù) 停止服務(wù)器 處理格式{stop, Reason, Reply, State} 第二個參數(shù)normal被用作terminate/2的第一個參數(shù) 第三個參數(shù)作為my_bank:stop/0的返回值
handle_call(stop, _From, Tab) -> {stop, normal, stopped, Tab}.
% handle_cast 處理的格式
% spec handle_cast(Msg, Statu) ->
% {noreply, State} |
% {noreply, State, TimeOut} |
% {stop, Reason, State}
% 異步的回調(diào)函數(shù) 處理格式{noreply, State}
handle_cast(_Msg, State) -> {noreply, State}.
% handle_info 處理的格式
% spec handle_info(Msg, Statu) ->
% {noreply, State} |
% {noreply, State, TimeOut} |
% {stop, Reason, State}
% 原生消息 不通過call或cast,直接發(fā)往服務(wù)器進程的消息 如:{'EXIT', Pid, Why} 或者知道此服務(wù)器pid的進程直接發(fā)過來的消息
handle_info(_Info, State) -> {noreply, State}.
% 以handle_開頭的回調(diào)收到{stop, Reason, State} | {stop, Reason, Reply, State},或者服務(wù)器奔潰生成{'EXIT',reason},會調(diào)用此回調(diào)函數(shù)
terminate(_Reason, _State) -> ok.
% 再代碼更改時轉(zhuǎn)換進程狀態(tài)
code_change(_OldVsn, State, _Extra) -> {ok, State}.