我有一个init函数,我称之为start_server:
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.
我认为start_server会返回Pid,以便我可以在Erlang终端中写出这样的内容:
> Server = server:start_server().
然后使用变量Server通过以下函数处理服务器:
move_left(Pid) ->
Pid ! {move, left}.
但是这不起作用,因为start_server()永远不会返回,为什么会这样?
答案 0 :(得分: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).