0
stop_link(UserDefined) ->
  gen_server:call({local, UserDefined}, terminate, [], []),
  ok

我正在使用透析器来修复 erlang 代码中的警告,我遇到了这个错误,它读取了 missing or unexported function gen_server:call/4

我无法理解这个罐子有什么问题,请任何人指导我,我刚开始使用 Erlang 的错误是什么,如果你能简要解释一下,我将不胜感激

4

1 回答 1

3

这段代码有很多问题。开始...

start_link调用该函数的原因是因为它启动了进程并链接到它。你的stop函数应该被调用stop

文档显示gen_server:call/2,3了此代码的两个问题:

  1. 您不需要{local, Name}带有gen_server:call. 您仅在调用时才需要它gen_server:start_link(并且只有在您想要为您的进程注册名称时才需要它)。要调用本地名称,只需使用Name. 或进程 ID。
  2. 没有具有 arity 4(即 4 个参数)的函数的变体。3-arity 变体需要超时。您可能想要 2-arity 之一。

怀疑您正在尝试在其中指定任意函数gen_server:call(即您要调用该terminate函数)。这不是它的工作原理。

gen_server:call(NameOrPid, Request)导致调用handle_call(Request, From, State). 请参阅文档

函数中,您可以匹配请求并执行适当的操作。像这样的东西:

handle_call(frob, _From, State) ->
    % do whatever 'frob' means.
    {reply, ok, NewState};

;可能是 a .,取决于这是否是最后一个handle_call子句)。

如果您真的希望服务器停止,您应该执行以下操作:

handle_call(terminate, _From, State) ->
    {stop, meh, State}.

将导致调用terminate.

哦,如果你只是在学习 Erlang,那么在你有更多经验之前,你可能不想运行 dialyzer。对于外行来说,这有点……棘手……。虽然它确实发现了这个错误,这很好。

于 2018-06-29T18:37:26.747 回答