2013-02-10 67 views
3

我正在读的“了解你一些二郎” this部分,有一段代码,看起来像:Erlang:发送消息给模块?

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

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

terminate() -> 
?MODULE ! shutdown. 

我由terminate功能超级困惑。这是否说要发送消息到模块本身?这是如何运作的?这是怎么回事?

回答

3

TL; DR:关机正在发送给进程,而不是模块。

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

本示例代码中发生了什么具体情况:正在生成的进程正在虚拟机的模块名称下注册,以便其他进程可以这样引用它。只要你每次给出相同的值,你就可以用几乎任何原子代替整个代码块中的MODULE。

因此,当调用terminate()时,关闭消息不会发送到模块,而是发送到生成的进程,并且已使用该VM注册到该进程下。

使用?MODULE只是避免与其他注册过程发生命名冲突的便利方法。

+0

这很有道理。谢谢! – 2013-02-10 20:12:51