首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Dialyzer错误调用丢失或未导出函数gen_server: call /4

Dialyzer错误调用丢失或未导出函数gen_server: call /4
EN

Stack Overflow用户
提问于 2018-06-29 18:16:03
回答 1查看 737关注 0票数 0
代码语言:javascript
运行
复制
stop_link(UserDefined) ->
  gen_server:call({local, UserDefined}, terminate, [], []),
  ok

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

我无法理解这是什么问题,任何人都请指导我的错误是什么,我刚刚开始与二郎,我将非常感谢你能简单地解释它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-29 18:37:26

这个代码有很多错误。来了..。

之所以调用start_link函数,是因为它启动了进程和对它来说。您的stop函数应该被称为stop

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

  1. 您不需要带有{local, Name}gen_server:call表单。您只在调用gen_server:start_link时才需要它(而且只有当您想要为您的进程注册名称时才需要它)。对于调用本地名称,只需使用Name。或者进程ID。
  2. 函数的变量没有第4次(即4个参数)。三度变量需要一个超时。你可能想要一个2度的。

我怀疑您试图在gen_server:call中指定任意函数(也就是说,您希望调用terminate函数)。这不是这么回事。

gen_server:call(NameOrPid, Request)会导致对handle_call(Request, From, State)的调用。见文献资料

在该函数中,您可以匹配请求并执行适当的操作。就像这样:

代码语言:javascript
运行
复制
handle_call(frob, _From, State) ->
    % do whatever 'frob' means.
    {reply, ok, NewState};

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

如果您真的希望服务器停止,则只需执行以下操作:

代码语言:javascript
运行
复制
handle_call(terminate, _From, State) ->
    {stop, meh, State}.

这将导致对terminate的调用。

哦,如果你只是在学习Erlang,你可能不想使用透析器,直到你有了更多的经验。有点..。狡猾..。对不熟悉的人来说。虽然它确实发现了这个错误,这很好。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51107357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档