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
的文档显示了此代码的两个问题:
- 您不需要带有
gen_server:call
的{local, Name}
表单。仅在调用gen_server:start_link
时才需要它(并且只有在您想要进程的注册名称时才需要它(。要调用本地名称,只需使用Name
.或进程 ID。 - 没有 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,你可能不想在你有更多的经验之前运行透析器。有点...棘手。。。对于外行。虽然它确实发现了这个错误,这很好。