#erlang
#erlang
Вопрос:
Это мой код, когда я запускаю: 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
Ответ №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, и это здорово, и я обещаю, что документация поможет вам решить множество мелких проблем на вашем пути к знаниям.
Комментарии:
1. Кроме того, требуемая функция обратного вызова gen_server_test:terminate / 2 не была определена или экспортирована — исправление, которое также важно, поэтому, как только вы исправите эту ошибку, вы не столкнетесь с другой при чистом завершении работы.
Ответ №2:
ваши методы handle_call
и handle_cast
должны возвращать кортеж типа {reply, Response, NewState}
or {noreply, NewState}
. Взгляните на документацию gen_server для получения дополнительной информации о разрешенных возвращаемых значениях..
io:format(..)
Функция возвращает только ok
.. именно по этой причине вы видите эту ошибку..