我对erlang比较陌生,并编写了以下模块:
-module(gserver).
-export([start1/0]).
-define(SERVER, gserver).
start1() ->
serv_util:start(?SERVER,
{ gserver, game_loop,
[dict:new(), dict:new()]}).
serv_util:
-module(serv_util).
-export([start/2]).
start(ServerName, {Module, Function, Args}) ->
global:trans({ServerName, ServerName},
fun() ->
case global:whereis_name(ServerName) of
undefined ->
Pid = spawn(Module, Function, Args),
global:register_name(ServerName, Pid);
_ ->
ok
end
end).
然后我尝试将其置于erlang的gen_server架构下,如下所示:
-module(s_child).
-behaviour(gen_server).
-export([start/0,stop/0]).
-export([init/1, handle_call/3,handle_cast/2, terminate/2,
handle_info/2,code_change/3]).
-import(gserver,[start1/0]).
-import(gclient,[login/1]).
start()->
gserver:start1(),
gen_server:start_link({global,?MODULE}, ?MODULE, [], []).
stop()->
gen_server:cast(?MODULE, {stop}).
log_in(Name)->
gen_server:call({global,?MODULE}, {login,Name,self()}).
init(_Args) ->
io:format("Hello started ~n"),
{ok,_Args}.
handle_call({login,Name},_From,State)->
State,
Reply=login(Name),
{reply, Reply,State}.
但是当我按照以下顺序打电话时
1)s_sup:START_LINK()
您好,开始 {确定,< 0.344.0>}
2)s_child:log_in( “阿布舍克巴克”)
** exception exit: {{function_clause,
[{s_child,handle_call,
[{login,"Abhishek",<0.335.0>},
{<0.335.0>,#Ref<0.0.4.457>},
[]],
[{file,"s_child.erl"},{line,61}]},
{gen_server,try_handle_call,4,
[{file,"gen_server.erl"},{line,615}]},
{gen_server,handle_msg,5,
[{file,"gen_server.erl"},{line,647}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,247}]}]},
{gen_server,call,
[{global,s_child},{login,"Abhishek",<0.335.0>}]}}
in function gen_server:call/2 (gen_server.erl, line 204)
我无法理解我的代码第61行究竟出了什么问题。在第61行的完整代码中存在以下代码:
handle_call(stop, _From, State) ->
{stop, normal, ok, State};
,即第61行出现第一个handle_call
请有人帮帮我。
答案 0 :(得分:3)
在log_in
函数中,您将{login,Name,self()}
作为gen_server调用传递,但handle_call
函数只需要{login,Name}
。因此,由于没有匹配子句,对handle_call
的调用失败。
您不需要传递self()
,因为您使用reply
功能确保响应将其返回给调用者,因此只需修改log_in
即可通过{login,Name}
至gen_server:call
。
答案 1 :(得分:0)
Legoscia的回答是正确的 我建议看Understanding gen_server 本文提供了有关使用gen_server的有用信息。