2016-11-28 59 views
1

我正在關注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}. 

回答

3

您可以存儲新的狀態變量,然後返回一個包含兩次變量元組:

handle_call({join, Name}, _From, Temple) -> 
    NewTemple = temple:join(Temple, Name), 
    {reply, NewTemple, NewTemple}; 
+0

衛生署,當然!謝謝! – quantumpotato