stop_link(UserDefined) ->
gen_server:call({local, UserDefined}, terminate, [], []),
ok
我使用透析器来修复erlang代码中的警告,我发现了一个错误,它读取了丢失或未导出的函数gen_server:call/4
。
我无法理解这是什么问题,任何人都请指导我的错误是什么,我刚刚开始与二郎,我将非常感谢你能简单地解释它。
发布于 2018-06-29 18:37:26
这个代码有很多错误。来了..。
之所以调用start_link
函数,是因为它启动了进程和对它来说。您的stop
函数应该被称为stop
。
文档 for 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};
( ;
可能是一个.
,这取决于这是否是最后的handle_call
子句)。
如果您真的希望服务器停止,则只需执行以下操作:
handle_call(terminate, _From, State) ->
{stop, meh, State}.
这将导致对terminate
的调用。
哦,如果你只是在学习Erlang,你可能不想使用透析器,直到你有了更多的经验。有点..。狡猾..。对不熟悉的人来说。虽然它确实发现了这个错误,这很好。
https://stackoverflow.com/questions/51107357
复制相似问题