- loop(State) ->
- receive
- apple when State == 3 ->
- io:format("Apple~n"),
- loop(2);
- android when State == 2 ->
- io:format("Android~n"),
- loop(1);
- wp when State == 1 ->
- io:format("Wp~n"),
- loop(3)
- end.
- test() ->
- PID = spawn(fun() -> loop(1) end),
- PID ! apple,
- PID ! android,
- PID ! wp,
- ok.
求运行test()的输出。(答案:
Wp Apple Android)
解析:遇见一个receive表达式,从信箱中取出一条消息(队列中的第一条消息),拿消息跟receive表达式中的第一个子句进行模式匹配,如果匹配成功,则绑定变量,执行与该子句关联的表达式,匹配结束,并将消息从信箱中删除。如果匹配失败,则拿该消息与receive中的第二个子句进行匹配,直到所有模式都匹配完毕。这个过程中如果有一个子句匹配成功,则执行与该子句关联的表达式,匹配结束,并将消息从信箱中删除;如果所有匹配都失败,那么该消息仍旧放回队列(原来的位置上),取出信箱中的第二条消息,再依次与receive表达式中的子句进行匹配。如果队列中的所有消息都匹配过了(有些匹配成功的已经从队列中删除,匹配失败的仍保留在队列中),此时不管队列中还有没有消息,Erlang进程都会阻塞住,直到队列中有新的消息到来,进程被唤醒,上述流程继续。(原文链接:http://fengchangjian.com/?p=1899)