4

我正在阅读“Learn you some Erlang”中的这一部分,其中有一段代码如下所示:

start() ->
register(?MODULE, Pid=spawn(?MODULE, init, [])),
Pid.

start_link() ->
register(?MODULE, Pid=spawn_link(?MODULE, init, [])),
Pid.

terminate() ->
?MODULE ! shutdown.

我对这个terminate功能感到非常困惑。那是说向模块本身发送消息吗?这是如何运作的?这是怎么回事?

4

1 回答 1

4

TL;DR:关机被发送到一个进程,而不是模块。

?MODULE是一个值,在编译时更改为当前模块(文件)的名称。

此代码示例中具体发生的情况是,正在生成的进程正在以模块名称向 VM 注册,以便其他进程可以通过这种方式引用它。你可以?MODULE用几乎任何原子替换整个代码块,只要你每次都给出相同的值。

因此,当terminate()被调用时,关闭消息不会发送到模块,而是发送到生成并以该名称向 VM 注册的进程。

使用?MODULE只是一种避免与其他注册进程命名冲突的便捷方法。

于 2013-02-10T19:53:03.697 回答