从旧考试开始,有一个问题我不明白答案。问题的模块如下所示:
-module(p4).
-export([start/0, init/0, f1/1, f2/1, f3/2]).
start() ->
spawn(fun() -> init() end).
init() -> loop(0).
loop(N) ->
receive
{f1, Pid} ->
Pid ! {f1r, self(), N},
loop(N);
{f2, Pid} ->
Pid ! {f2r, self()},
loop(N+1);
{f3, Pid, M} ->
Pid ! {f3r, self()},
loop(M)
end.
f1(Serv) ->
Serv ! {f1, self()},
receive {f1r, Serv, N} -> N end.
f2(Serv) ->
Serv ! {f2, self()},
receive {f2r, Serv} -> ok end.
f3(Serv, N) ->
Serv ! {f3, self(), N},
receive {f3r, Serv} -> ok end.
该问题要求将以下函数视为代码的一部分,以及函数的结果是什么。正确答案是2.我认为它是3,因为“增加号召”f2(Server)
是在self()!{f1r, Server, 2}
的回复之后。
test3() ->
Server = start(),
self()!{f1r, Server, 2},
f2(Server),
f1(Server).
我的问题是:
self()!{f1r, Server, 2}
如何运作? self()!{f1r, Server, 2}
函数的loop(N)
中的receive子句的f1(Serv)
响应不是吗?答案 0 :(得分:1)
self()!{f1r, Server, 2}
将{f1r, Server, 2}
发送给自己。
此消息将在收件箱中等待,直到收到。
然后执行f2
,然后执行f1
。
在最后一个函数中,当执行最后一行receive {f1r, Serv, N} -> N end
时,运行test3
的进程收到在收件箱中等待的消息(发送给自己的消息)并返回2消息。
请注意,在程序结束时,收件箱中会有{f1r, <process number>, N}
等待,N的值为1.