我不应该直接打电话给 gen_server:stop() 吗?

Should I not call gen_server:stop() directly?

LYSE 书中,作者按如下方式处理服务器的终止:

%% Synchronous call
close_shop(Pid) -> gen_server:call(Pid, terminate).

handle_call(terminate, _From, Cats) ->
    {stop, normal, ok, Cats}.

terminate(normal, Cats) ->
    [io:format("~p was set free.~n",[C#cat.name]) || C <- Cats],
    ok.

所以它 returns 来自 handle_call 回调的 stop 值。

我是这样写的:

close_shop(Pid) -> gen_server:stop(Pid).

terminate(_Reason, {Cats, Money}) ->
    io:format("Made $~w~n", [Money]),
    [io:format("~p was set free.~n",[C#cat.name]) || C <- Cats].

直接调用 gen_server:stop() 这不是一个好习惯吗?

直接调用 gen_server:stop/1,3 并不是一个坏习惯。它做的事情与 LYSE 中的示例几乎相同,但没有从您的模块中调用 handle_call/3。尝试检查一下。你甚至可以阅读源代码来确定。