stop_link(UserDefined) ->
gen_server:call({local, UserDefined}, terminate, [], []),
ok
我正在使用透析器来修复erlang代码中的警告,我遇到了读取缺少或未导出的函数gen_server:call/4
的错误。
我无法理解此功能罐有什么问题,任何人都可以指导我该发生什么错误。我刚开始使用Erlang,如果可以简要解释一下,将不胜感激。。< / p>
答案 0 :(得分:3)
此代码有很多错误。来...
调用start_link
函数的原因是因为它启动了进程和links to it。您的stop
函数应被称为stop
。
gen_server:call/2,3
的{{3}}使用此代码显示了两个问题:
{local, Name}
的{{1}}表格。仅在调用gen_server:call
时才需要它(并且只有在您想要为进程注册名称时才需要)。要调用本地名称,只需使用gen_server:start_link
。或进程ID。我怀疑,您正在尝试在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,那么您可能不希望在没有更多经验之前运行透析器。对于没有经验的人来说有点棘手。尽管它确实找到了这个错误,但这很好。