4

「LearnyousomeErlang」のこのセクションを読んでいたところ、次のようなコードがあります。

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 に答える