Erlang 透析器错误呼叫丢失或未报告的功能gen_服务器:呼叫/4

Erlang 透析器错误呼叫丢失或未报告的功能gen_服务器:呼叫/4,erlang,gen-server,dialyzer,Erlang,Gen Server,Dialyzer,我正在使用透析器修复erlang代码中的警告,我遇到了这样一个错误,即读取缺失或未报告的函数gen_server:call/4 我无法理解这个can的错误,任何人请告诉我错误是什么,我刚开始使用Erlang,如果您能简单解释一下,我将不胜感激。此代码有很多错误。这是 之所以调用start\u link函数,是因为它启动了进程并启动了。您的stop函数应该只调用stop forgen_server:call/2,3显示了此代码的两个问题: 您不需要{local,Name}表单和genu服务器:ca

我正在使用透析器修复erlang代码中的警告,我遇到了这样一个错误,即读取缺失或未报告的函数
gen_server:call/4


我无法理解这个can的错误,任何人请告诉我错误是什么,我刚开始使用Erlang,如果您能简单解释一下,我将不胜感激。

此代码有很多错误。这是

之所以调用
start\u link
函数,是因为它启动了进程并启动了。您的
stop
函数应该只调用
stop

for
gen_server:call/2,3
显示了此代码的两个问题:

  • 您不需要
    {local,Name}
    表单和
    genu服务器:call
    。只有在调用
    gen\u server:start\u link
    时才需要它(只有在需要进程的注册名称时才需要)。要调用本地名称,只需使用
    Name
    。或者进程ID
  • 该函数没有arity 4(即4个参数)的变体。3-arity变量需要超时。你可能想要二元的
  • 我怀疑您试图在
    genu server:call
    中指定任意函数(即,您想调用
    终止
    函数)。这不是怎么回事

    gen\u server:call(NameOrPid,Request)
    导致调用
    handle\u call(Request,From,State)
    。看

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

    stop_link(UserDefined) ->
      gen_server:call({local, UserDefined}, terminate, [], []),
      ok
    
    (该
    可能是
    ,这取决于这是否是最后的
    句柄调用
    子句)

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

    handle_call(frob, _From, State) ->
        % do whatever 'frob' means.
        {reply, ok, NewState};
    
    这将导致调用
    终止


    哦,若你们只是在学习Erlang,你们可能不想运行透析器,除非你们有更多的经验。有点。。。棘手的对于不熟悉的人。虽然它确实发现了这个错误,但这很好。

    这段代码有很多错误。这是

    之所以调用
    start\u link
    函数,是因为它启动了进程并启动了。您的
    stop
    函数应该只调用
    stop

    for
    gen_server:call/2,3
    显示了此代码的两个问题:

  • 您不需要
    {local,Name}
    表单和
    genu服务器:call
    。只有在调用
    gen\u server:start\u link
    时才需要它(只有在需要进程的注册名称时才需要)。要调用本地名称,只需使用
    Name
    。或者进程ID
  • 该函数没有arity 4(即4个参数)的变体。3-arity变量需要超时。你可能想要二元的
  • 我怀疑您试图在
    genu server:call
    中指定任意函数(即,您想调用
    终止
    函数)。这不是怎么回事

    gen\u server:call(NameOrPid,Request)
    导致调用
    handle\u call(Request,From,State)
    。看

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

    stop_link(UserDefined) ->
      gen_server:call({local, UserDefined}, terminate, [], []),
      ok
    
    (该
    可能是
    ,这取决于这是否是最后的
    句柄调用
    子句)

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

    handle_call(frob, _From, State) ->
        % do whatever 'frob' means.
        {reply, ok, NewState};
    
    这将导致调用
    终止


    哦,若你们只是在学习Erlang,你们可能不想运行透析器,除非你们有更多的经验。有点。。。棘手的对于不熟悉的人。尽管它确实发现了这个错误,这很好。

    我在文档中没有看到任何四个参数版本的
    gen_server:call
    。我在文档中没有看到任何四个参数版本的
    gen_server:call
    。这些东西在第二行末尾做了什么,我删除了其中一个方括号以匹配gen_server:call/3。错误已修复。genu-server:call({local,UserDefined},terminate,[]),这些只是空列表。删除其中一个将修复函数调用的arity,但它仍然不起作用,因为空列表不是有效的超时值。在第二行末尾,[]这些操作的作用是什么,我删除了其中一个方括号以匹配gen_server:call/3错误已修复。genu-server:call({local,UserDefined},terminate,[]),这些只是空列表。删除其中一个将修复函数调用的arity,但仍然不起作用,因为空列表不是有效的超时值。