您的位置:首页 > 其它

Erlang入门:服务进程实例操作与练习1

2015-01-13 09:11 369 查看
这是一个用Erlang进程实现的简单银行服务

使用示例如下:

创建用户:bank:create_account(myname, 100).

用户存钱:myname ! {deposit, 10}.

用户取钱:myname ! {cash1, 20}.

myname ! {cash2, 30}.

查询余额:myname ! check.

创建用户:bank:create_account(rolong, 100).

用户存钱:rolong ! {deposit, 10}.

用户取钱:rolong ! {cash1, 20}.

rolong ! {cash2, 30}.

查询余额:rolong ! check.

%% @author Rolong

-module(bank).
-compile(export_all).

-define(I(F), io:format(F++"~n", [])).
-define(I(F, A), io:format(F++"~n", A)).

%% 这是一个用Erlang进程实现的简单银行服务
%% 使用示例如下:
%%
%% 创建用户:bank:create_account(myname, 100).
%% 用户存钱:myname ! {deposit, 10}.
%% 用户取钱:myname ! {cash1, 20}.
%%           myname ! {cash2, 30}.
%% 查询余额:myname ! check.
%%
%% 创建用户:bank:create_account(rolong, 100).
%% 用户存钱:rolong ! {deposit, 10}.
%% 用户取钱:rolong ! {cash1, 20}.
%%           rolong ! {cash2, 30}.
%% 查询余额:rolong ! check.

%%'银行开户,并存入初始金额
create_account(Name, Money)->
Pid = spawn(?MODULE, server, [Money]),
%% 假设年费为10
Pid ! {yearly, 10},
erlang:register(Name, Pid).
%%.

%%'银行服务中心
server(Money) ->
receive
Msg ->
NewMoney = ?MODULE:handle(Msg, Money),
server(NewMoney)
end.
%%.

%%'银行服务窗口

%%'存钱
handle({deposit, AddMoney}, Money) ->
NewMoney = Money + AddMoney,
?I("deposit money: ~w -> ~w", [Money, NewMoney]),
NewMoney;
%%.

%%'取钱(可透支)
handle({cash1, SubMoney}, Money) ->
NewMoney = Money - SubMoney,
?I("deposit money: ~w -> ~w", [Money, NewMoney]),
NewMoney;
%%.

%%'取钱(不可透支)
handle({cash2, SubMoney}, Money) ->
NewMoney = Money - SubMoney,
case NewMoney > 0 of
true ->
%% 支取成功
?I("deposit money: ~w -> ~w", [Money, NewMoney]),
NewMoney;
false ->
%% 支取失败 提示余额不足
?I("Insufficient balance, current money is ~w", [Money]),
Money
end;
%%.

%%'扣年费(这里假设10秒为一年)
handle({yearly, Payment}, Money) ->
Year = case get(year) of
undefined ->
put(year, 0),
0;
Y ->
YY = Y + 1,
put(year, YY),
YY
end,
erlang:send_after(10 * 1000, self(), {yearly, Payment}),
if
Money =< 0 ->
%% 没有钱可以扣
Money;
Year =:= 0 ->
%% 还不到一年,不用扣
Money;
true ->
NewMoney = Money - Payment,
case NewMoney > 0 of
true ->
%% 扣费成功
?I("Yearly Payment: ~w -> ~w", [Money, NewMoney]),
NewMoney;
false ->
%% 余额不足以扣年费,则扣到0为止
?I("Yearly Payment: ~w -> ~w", [Money, 0]),
0
end
end;
%%.

%%'查询
handle(check, Money) ->
?I("Current money is: ~w", [Money]),
Money;
%%.

%%'收到目前不受理的业务,反馈给客户
handle(Msg, Money) ->
?I("Do NOT accept business:~p", [Msg]),
Money.
%%.

%%.

%% vim: set filetype=erlang foldmarker=%%',%%. foldmethod=marker:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  erlang 入门教程 实例