2014-04-18 22 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).