функция не экспортируется в эрланге - PullRequest
3 голосов
/ 06 мая 2011

Это мой код, когда я запускаю: 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

Ответы [ 2 ]

10 голосов
/ 06 мая 2011

Вот важная часть отчета об ошибке: {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, и это здорово, и я обещаю, что документация 1014 * поможет вам решить множество мелких проблем на вашем пути.к знанию.

1 голос
/ 06 мая 2011
Методы

ваши handle_call и handle_cast должны возвращать кортеж типа {reply, Response, NewState} или {noreply, NewState}. Посмотрите документацию gen_server для получения дополнительной информации о допустимых возвращаемых значениях.

Функция io:format(..) возвращает только ok .. именно поэтому вы видите эту ошибку ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...