0

Erlang モジュールで問題が発生しています。これが私が書いたものです:

-module(basic_gen_server)。-export([start/1, call/2, cast/2]).

start(Module) ->
    register(server, spawn(basic_gen_server,gen_server_loop,[Module, Module:init()])), server.

call(Pid,Request) -> 
    Pid ! {call, self(), Request},
    receive
        Reply -> Reply
    end.

cast(Pid,Request) ->
    Pid ! {cast, self(), Request},
    receive
        _ -> ok
    end.

gen_server_loop(Module, CurrentState) -> 
    io:fwrite("gen_server_loop~n", []),
    receive
        {call, CallPid, Request} -> 
            {reply, Reply, NewState} = Module:handle_call(Request,self(),CurrentState),
            CallPid ! Reply,
            gen_server_loop(Module, NewState);
        {cast, CastPid, Request} ->
            {noReply, NewState} = Module:handle_cast(Request, CurrentState),
            CastPid ! noReply,
            gen_server_loop(Module, NewState)
    end.

定義されたコールバック モジュールは次のとおりです。

% Written by Caleb Helbling
% Last updated Oct 10, 2014

-module(name_server).
-export([init/0, add/3, whereis/2, handle_cast/2,
         handle_call/3, handle_swap_code/1]).

%% client routines

add(ServerPid, Person, Place) ->
    basic_gen_server:cast(ServerPid, {add, Person, Place}).

whereis(ServerPid, Person) ->
    basic_gen_server:call(ServerPid, {whereis, Person}).

%% callback routines

init() ->
    maps:new().

handle_cast({add, Person, Place}, State) ->
    NewState = maps:put(Person, Place, State),
    {noreply, NewState}.

handle_call({whereis, Person}, _From, State) ->
    Reply = case maps:find(Person, State) of
        {ok, Place} -> Place;
        error -> error
    end,
    NewState = State,
    {reply, Reply, NewState}.

handle_swap_code(State) ->
    {ok, State}.

次のコマンドでサーバーを初期化しようとしたとき:

MyServer = basic_gen_server:start(name_server).

次のデバッグ出力が得られます。

=ERROR REPORT==== 29-Oct-2014::12:41:42 ===
Error in process <0.70.0> with exit value: {undef,[{basic_gen_server,gen_server_loop,[name_server,#{}],[]}]}

概念的には、シリアル コードを基本的なサーバー システムにするという概念は理解していますが、構文の強調表示や Google を使用しても見つけられなかった構文エラーがあると思います。助けてくれてありがとう!

4

1 に答える 1

1

関数gen_server_loopはエクスポートされません。そのため、 を呼び出すことはできません。basic_gen_server:gen_server_loop(Module, Module:init())これは、内部で起こっていること spawn(basic_gen_server,gen_server_loop,[Module, Module:init()])です。

エラー メッセージを読むと、関数が未定義 (trogn undefatom) で呼び出そうとしていることがわかります。機能が存在{basic_gen_server,gen_server_loop,[name_server,#{}],[]}する、またはあなたが持っている場所{Module, Function, ListOfArgs, ...}。あなたは常にそれをチェックする必要があります

  • 型モジュールまたは関数名はありません
  • 関数アリティは、呼び出し中の引数の数と一致します (エラーメッセージにリスト)
  • 関数がエクスポートされます

function が定義されていない場合、すべてのローカル呼び出し (loop(SomeArgs)モジュールが指定されていない など) はコンパイルされません。そして、動的にローカル呼び出しを行うことができます (FuntionName(SomeArgs)モジュール名なしで)。


市内通話の必要性についてのコメントの後に編集します。

これには実際にラムダを使用できます。spawn/1ラムダ(または必要に応じて)を取る機能があるのでfun、 を呼び出すことができますspawn( fun local_functino/0).。それに関する唯一の問題はfun、引数を取ることができないという事実ですが、クロージャーを使用してそれを回避する方法があります。

spawn(fun () ->
         gen_server_loop(Module, Module:init())
      end).

そして、gen_serve_loop市内通話のままです。

于 2014-10-29T16:57:13.287 に答える