だけでなく、機能broadcast
は、プロセス内で実行されます。したがって、この関数はすべてのプロセスからアクセス可能でなければなりません。同じモジュール内の同じソースコードは、同じモジュールから関数を実行するプロセスを生成しますが、その関数をそのモジュールからエクスポートしてアクセス可能にする必要があります。
これは、spawn(fun() -> broadcast() end).
とspawn(?MODULE, broadcast, [])
の違いに私をもたらします。後者はSpawning with MFA
と呼ばれます。この方法では、関数を実行できるように関数をモジュールからエクスポートする必要があります。前者はユニークですが、そのaはfun
です。
spawn(fun() -> broadcast() end).
この方法を理解するには、これとこの値を比較する必要があります。spawn(fun() -> ?MODULE:broadcast() end).
さて、機能broadcast
がモジュールにエクスポートされていない場合、ここでは、今2
spawn(fun() -> ?MODULE:broadcast() end).
の後半の話をすることができます:
?MODULE
、プロセスがクラッシュします。この場合、関数はこのソースコードが記述されているモジュールの中にあります。
spawn(fun() -> broadcast() end).
この場合、関数はこのソースコードが記述されているモジュールの中になければなりません。しかし、私の考えはこれです。コンパイラはこれを上記のものに変換して、あなたが探している関数がモジュール
?MODULE
にあることを、生成されたプロセスに伝えます。
私は実際にコンパイラやランタイムシステムでは教祖ではありませんが、この回答を使用すると思います。私の強いアドバイスは、あなたのソースコードの大部分で、コードまたは関数がこれよりも同じモジュールにあるにもかかわらず、
spawn(fun() -> ?MODULE:broadcast() end).
または
spawn(fun() -> some_module:broadcast() end).
を使用してください:
spawn(fun() -> broadcast() end).
。私の個人的な経験から、コードは扱いやすく理解できるようになります。私は生成されたプロセスが指定されたモジュールから関数を見つけて、与えられた引数で実行しなければならないという、この素晴らしい錯覚を得ます。
書かれているように、 'init/1'関数と' init/1'関数の両方を呼び出せるように 'start/0'関数を両方ともエクスポートする必要があります。あなたが行ったように 'spawn/3'で関数を生成すると、その関数もまたエクスポートされなければなりません。もう一つの方法は、他の人たちが示唆しているように、楽しさを生み出すことです。 – rvirding