变量在 Erlang 中绑定一次



编辑:我更改了这个问题的标题,因为鉴于我犯的n00b错误,它没有用。其余部分保持不变,并作为一个警示故事!

我使用的是 Erlang OTP 版本 17.4。考虑下面的 Erlang shell 会话,我正在试验 trap_exit 进程标志,如"学习一些 Erlang:错误和进程"中所述。

首先,我设置 trap_exit 标志以将链接进程中的退出信号转换为常规消息:

Eshell V6.2  (abort with ^G)
1> process_flag(trap_exit, true).
false

然后我生成一个链接的进程,并通过调用 exit/2 立即终止它:

2> exit(spawn_link(fun() -> timer:sleep(50000) end), kill).
true

然后我阅读了转换后的退出消息:

3> receive X -> X end.
{'EXIT',<0.61.0>,killed}

到目前为止,一切看起来都不错,就像书中所描述的那样。现在,只是为了好玩,我spawn_link并终止另一个进程:

4> exit(spawn_link(fun() -> timer:sleep(5000) end), kill).
true

并尝试阅读转换后的退出消息:

5> receive X -> X end.

此时,外壳挂起。我的问题是为什么第二个行为会发生变化,退出消息去哪儿了?

您的第二个receive X -> X end.已经绑定X;它正在尝试接收与您已经看到的消息完全匹配的消息。由于 pid 将有所不同,因此消息将永远不匹配。所以它挂起来,等待一个匹配的。

您需要先f(X)

最新更新