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

这是一个用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:

   
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值