我正在關注http://learnyousomeerlang.com/static/erlang/kitty_gen_server.erl。從gen_server轉換返回狀態
我有我的應用程序邏輯在temple.erl裏面。所有這些代碼都經過測試&按我的預期運行。我的land.erl旨在成爲包含聖殿的服務器。
我的理解(請糾正任何無知)是我可以使用gen_server來抽象消息傳遞並以最小的開銷跟蹤狀態。
我明白,在我的初始化函數
init([]) -> {ok, temple:new()}.
第二tuplevalue是我的服務器的狀態 - 在這種情況下,temple:new()
返回值。所以我c(land)
。 (下面的代碼),並嘗試這個辦法:
19> {ok, Pid2} = land:start_link().
{ok,<0.108.0>}
20> land:join(Pid2, a).
ok
,我剛剛得到的原子OK回來時,我送加入消息從閱讀的代碼,並比較運行kitty_gen_server我的經驗,我覺得狀態與正確更新價值temple:join(Temple, Name)
,但確定原子是
handle_call({join, Name}, _From, Temple) ->
{reply, ok, temple:join(Temple, Name)};
響應值我如何與寺廟更新我的狀態:加入(寺,名稱),然後將該值返回到客戶端?我不想兩次調用相同的函數,例如。
handle_call({join, Name}, _From, Temple) ->
{reply, temple:join(Temple, Name), temple:join(Temple, Name)};
所以看kitty_gen_server我試圖
handle_call({join, Name}, _From, Temple) ->
[{reply, JoinedTemple, JoinedTemple} || JoinedTemple <- temple:join(Temple, Name)];
,我得到一個功能的語句崩潰當我嘗試這與有關語法錯誤信息||,然後我看到這是隻對名單理解..
我該如何計算temple:join(Temple, Name)]
的價值並返回給土地的來電者:加入並更新土地的國家?
-module(land).
-behaviour(gen_server).
-export([start_link/0, join/2, input/3, fight/1]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
start_link() ->
gen_server:start_link(?MODULE, [], []).
join(Pid, Name) ->
gen_server:call(Pid, {join, Name}).
input(Pid, Action, Target) ->
gen_server:call(Pid, {input, Action, Target}).
fight(Pid) ->
gen_server:call(Pid, fight).
init([]) -> {ok, temple:new()}.
handle_call({join, Name}, _From) ->
{reply, ok, temple:join(Name)}.
handle_call({join, Name}, _From, Temple) ->
{reply, temple:join(Temple, Name), temple:join(Temple, Name)};
handle_call(terminate, _From, Temple) ->
{stop, normal, ok, Temple}.
handle_info(Msg, Temple) ->
io:format("Unexpected message: ~p~n",[Msg]),
{noreply, Temple }.
terminate(normal, Temple) ->
io:format("Temple bathed in blood.~p~n", [Temple]),
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
handle_cast(_, Temple) ->
{noreply, Temple}.
衛生署,當然!謝謝! – quantumpotato