erlang 是否有选项可用于在gen server中添加条件?

uqjltbpv  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(168)

谢谢大家看这个问题,如果你们能解决我的问题,那将是非常有帮助和感激的。
我用erlang创建了一个gen服务器,用于银行业务,我刚刚创建了一个用于存款和取款的服务器。它运行得非常好,我现在需要的是为取款添加条件。比如,如果要取款的金额将使余额低于100,则必须中止取款并且必须显示诸如“最小余额为100”的显示消息。我正在自学,这是为了我对gen服务器如何在条件下工作的好奇心。这里是退出发生的部分。

deallocate(Available,M) ->
    New_state1 = Available - M,
    io:format("Amount withdrawn : ~p~n",[M]),
    io:format("Total Balance : ~p~n",[New_state1]),
    Reply = withdrawn,
    {New_state1,Reply}.

从上面的几行可以看出,这是撤销的地方,现在我被困在这里,我可以在哪里和如何添加条件。
任何帮助都是非常感谢和提前感谢,甚至尝试。再见!!

hrysbysz

hrysbysz1#

我假设你从handle_call/3中调用这个deallocate/2函数,并且将回复返回给调用者,类似于...

handle_call({deallocate, M}, _From, State) ->
    {NewState, Reply} = deallocate(State, M),
    {reply, Reply, NewState};
…

如果是这种情况,您只需要向客户端返回一条错误消息,而不是withdrawn ...

deallocate(Available,M) ->
    case Available - M of
        NewState when NewState < 100 ->
            {Available, {error, balance_under_minimum}};
        NewState ->
            io:format("Amount withdrawn : ~p~n",[M]),
            io:format("Total Balance : ~p~n",[NewState]),
            {NewState, withdrawn}
    end.

当然,在客户端,您必须 * 理解 * 错误消息,因此,不要...

deallocate(M) -> gen_server:call(the_bank, {deallocate, M}).

......你会......

deallocate(M) ->
    case gen_server:call(the_bank, {deallocate, M}) of
        withdrawn -> withdrawn;
        {error, balance_under_minimum} ->
            io:format("Minimum balance is 100\n"),
            not_withdrawn
    end.

相关问题