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

时间:2018-06-29 18:16:04

标签: erlang gen-server dialyzer

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

我正在使用透析器来修复erlang代码中的警告,我遇到了读取缺少或未导出的函数gen_server:call/4的错误。

我无法理解此功能罐有什么问题,任何人都可以指导我该发生什么错误。我刚开始使用Erlang,如果可以简要解释一下,将不胜感激。。< / p>

1 个答案:

答案 0 :(得分:3)

此代码有很多错误。来...

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

gen_server:call/2,3的{​​{3}}使用此代码显示了两个问题:

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

怀疑,您正在尝试在Name中指定一个任意函数(即您想调用gen_server:call函数)。那不是这样的。

terminate导致调用gen_server:call(NameOrPid, Request)。参见documentation

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

handle_call(Request, From, State)

handle_call(frob, _From, State) -> % do whatever 'frob' means. {reply, ok, NewState}; 可能是;,具体取决于这是否是最后的.子句)。

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

handle_call

那个将导致呼叫handle_call(terminate, _From, State) -> {stop, meh, State}.

哦,如果您只是在学习Erlang,那么您可能不希望在没有更多经验之前运行透析器。对于没有经验的人来说有点棘手。尽管它确实找到了这个错误,但这很好。