在erlang

时间:2017-07-13 12:09:32

标签: erlang otp erlang-shell

我对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

请有人帮帮我。

2 个答案:

答案 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的有用信息。