【问题标题】:'function not exported' in erlangerlang中的“函数未导出”
【发布时间】:2011-05-06 10:08:23
【问题描述】:

这是我的代码,当我运行:gen_server_test:alloc,它给了我错误,请帮助我

-module(gen_server_test).
-behaviour(gen_server).
-export([start_link/0]).
-export([alloc/0, free/1]).
-export([init/1, handle_call/3, handle_cast/2]).
start_link() ->
    gen_server:start_link({local, gen_server_test}, gen_server_test, [], []).

alloc() ->
    io:format("allocing"),
        gen_server:call(?MODULE, {alloc}).

free(Ch) ->
    gen_server:cast(gen_server_test, {free, Ch}).

init(_Args) ->
    {ok, channels()}.

handle_call({alloc}, _From, LoopData) ->
    io:format("handle alloc").

handle_cast({free, Ch}, LoopData) ->
    io:format(Ch).

free() -> 
        io:format("free").

channels() ->
    io:format("channels").

错误:

23> gen_server_test:alloc().     
allocinghandle alloc
=ERROR REPORT==== 6-May-2011::18:05:48 ===
** Generic server gen_server_test terminating 
** Last message in was {alloc}
** When Server state == ok
** Reason for termination == 
** {'function not exported',
       [{gen_server_test,terminate,[{bad_return_value,ok},ok]},
        {gen_server,terminate,6},
        {proc_lib,init_p_do_apply,3}]}
** exception exit: undef
     in function  gen_server_test:terminate/2
        called as gen_server_test:terminate({bad_return_value,ok},ok)
     in call from gen_server:terminate/6
     in call from proc_lib:init_p_do_apply/3

【问题讨论】:

    标签: erlang


    【解决方案1】:

    这里是错误报告的重要部分:{bad_return_value,ok} handle_call/3 的有效返回值为:

      {reply,Reply,NewState} 
    | {reply,Reply,NewState,Timeout}
    | {reply,Reply,NewState,hibernate}
    | {noreply,NewState} 
    | {noreply,NewState,Timeout}
    | {noreply,NewState,hibernate}
    | {stop,Reason,Reply,NewState} 
    | {stop,Reason,NewState}
    

    将你的 handle_call 重写为:

    handle_call({alloc}, _From, LoopData) ->
      Reply = io:format("handle alloc"),
      {reply, Reply, LoopData}
    

    现在将“解决”问题。但我建议您通读 gen_server 的文档,因为您还有其他一些奇怪的事情正在发生。例如,您的状态是ìo:format("channels") 的结果。这根本没有任何意义。

    我猜你正在学习 gen_servers,这很好,我保证 documentation 将帮助你解决许多小问题。

    【讨论】:

    • 此外,未定义或导出所需的回调函数 gen_server_test:terminate/2 - 修复这一点也很重要,因此一旦修复此错误,您就不会在干净关闭时遇到另一个错误。跨度>
    【解决方案2】:

    您的handle_callhandle_cast 方法需要返回{reply, Response, NewState}{noreply, NewState} 类型的元组。查看gen_server 文档以获取有关允许的返回值的更多信息。

    io:format(..) 函数仅返回 ok.. 这就是您看到此错误的原因..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-11
      • 2020-01-22
      • 2013-02-26
      • 2020-12-28
      • 1970-01-01
      • 2019-08-11
      • 2011-07-06
      • 1970-01-01
      相关资源
      最近更新 更多