『プログラミングErlang』8.6で解説されている選択受信について、ちゃんと理解できているか自信がなくなってきたので、下のようなコードを書いて実験した。
loop(X) -> Y = X + 1, receive X -> io:format("received: ~p, continue.~n", [X]), loop(Y); Y -> io:format("received: ~p, finish.~n", [Y]) end.
receiveのパターンにマッチしなかったメッセージは捨てられるわけではない。プロセスの「メールボックス」に保存されたまま照合の機会を待ち続ける。
9> Pid = spawn(fun() -> lib_misc:loop(1) end). <0.49.0> 10> Pid ! 1. received: 1, continue. 1 11> Pid ! 2. received: 2, continue. 2 12> Pid ! 6. 6 % この時点ではマッチしない 13> Pid ! 3. received: 3, continue. 3 14> Pid ! 4. received: 4, continue. 4 received: 6, finish. % 再び照合が行われ、マッチした!