2014-04-18 23 views
0

我有一個初始化函數,我稱之爲START_SERVER:spawn_link正在啓動一個無限循環,但不返回?

start_server() -> 
    spawn_link(game_loop(0,0)). 

目的是啓動一個新的進程,開始循環,等待有人來發送消息有:

game_loop(X,Y) -> 
receive 
{move, left} -> 
    tell_client(X+1,Y), 
    game_loop(X+1,Y); 

{move, right} -> 
    tell_client(X-1,Y), 
    game_loop(X-1,Y) 
end. 

我thaught是start_server會返回Pid,以便我可以在Erlang終端中寫下類似這樣的內容:

> Server = server:start_server(). 

然後使用變量服務器通過類似的功能處理的服務器:

move_left(Pid) -> 
    Pid ! {move, left}. 

但是,這並不工作,因爲START_SERVER()永遠不會返回,這是爲什麼?

回答

6

函數spawn_link/1將函數作爲參數。但是,在您的代碼不傳遞一個函數到其中:

start_server() -> 
    spawn_link(game_loop(0,0)). 

這樣品意味着該函數game_loop/2將被稱爲第一,它返回spawn_link/1將是調用的game_loop/2結果的一個參數來調用後。但是你的函數game_loop/2實現無限循環,所以它永遠不會返回,所以spawn_link/1永遠不會被調用。如果我們甚至認爲game_loop/2返回它必須返回一個函數來正確地調用spawn_link/1,否則例外將上升。

做你想做的,你應該通過game_loop/2作爲一個功能到spawn_link/1什麼:

start_server() -> 
    spawn_link(fun() -> game_loop(0,0) end).