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


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

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

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

这段代码有很多问题。来了...

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

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

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

怀疑您正在尝试在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};

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

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

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

这将导致调用terminate

哦,如果你只是刚刚学习 Erlang,你可能不想在你有更多的经验之前运行透析器。有点...棘手。。。对于外行。虽然它确实发现了这个错误,这很好。

相关内容

  • 没有找到相关文章

最新更新