stop_link(UserDefined) ->
gen_server:call({local, UserDefined}, terminate, [], []),
ok
我正在使用透析器来修复 erlang 代码中的警告,我遇到了这个错误,它读取了 missing or unexported function gen_server:call/4
。
我无法理解这个罐子有什么问题,请任何人指导我,我刚开始使用 Erlang 的错误是什么,如果你能简要解释一下,我将不胜感激。
stop_link(UserDefined) ->
gen_server:call({local, UserDefined}, terminate, [], []),
ok
我正在使用透析器来修复 erlang 代码中的警告,我遇到了这个错误,它读取了 missing or unexported function gen_server:call/4
。
我无法理解这个罐子有什么问题,请任何人指导我,我刚开始使用 Erlang 的错误是什么,如果你能简要解释一下,我将不胜感激。
这段代码有很多问题。开始...
start_link
调用该函数的原因是因为它启动了进程并链接到它。你的stop
函数应该被调用stop
。
的文档显示gen_server:call/2,3
了此代码的两个问题:
{local, Name}
带有gen_server:call
. 您仅在调用时才需要它gen_server:start_link
(并且只有在您想要为您的进程注册名称时才需要它)。要调用本地名称,只需使用Name
. 或进程 ID。我怀疑您正在尝试在其中指定任意函数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。对于外行来说,这有点……棘手……。虽然它确实发现了这个错误,这很好。