透析器错误调用丢失或未导出的函数 gen_server:call/4

Dialyzer Errors call to missing or unexported function gen_server:call/4

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

我正在使用 dialyzer 修复 erlang 代码中的警告,我遇到了这个错误,它显示缺少或未导出的函数 gen_server:call/4

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

这段代码有很多错误。开始了...

调用 start_link 函数的原因是因为它启动了进程和 links to it。您的 stop 函数应该被称为 stop.

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

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

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

gen_server:call(NameOrPid, Request) 导致调用 handle_call(Request, From, State)。参见 the documentation

that函数中,可以匹配请求,做相应的事情。像这样:

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

; 可能是 .,取决于这是否是最终的 handle_call 子句。

如果你真的想让服务器停止,你应该只做下面的事情:

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

将调用 terminate

哦,如果您只是刚开始学习 Erlang,您可能不想成为 运行 透析器,直到您获得更多经验。对于初学者来说,这有点……棘手……。虽然它确实发现了这个错误,这很好。