2016-01-12 12 views

答えて

7

  • fun M:F/Aによって作成された楽しさが外部の楽しと呼ばれています。これを呼び出すと、モジュールMの最新のコードで、FのアリティーがAの関数が呼び出されます。 fun M:F/Aが作成されると、モジュールMは読み込まなくてもよいことに注意してください。

  • 他のすべての楽しみはローカルfunと呼ばれます。ローカルのfunが呼び出されると、新しいバージョンのモジュールがロードされている場合でも、funを作成したコードと同じバージョンが呼び出されます。

ドキュメントが言うように彼らは、コードのアップグレードで異なる動作を持っています。最初のモジュールはローカル関数(fun f/0)を使用し、2番目のモジュールは外部関数(fun ?MODULE:f/0を使用しています(前処理ではfun some_mod:f/0に置き換えられています)。

したがって、ローカル機能を使用する最初のモジュールをアップグレードする場合、some_funを使用しているプロセスは、新しいバージョンを使用しないでください。しかし、外部関数を使用する2番目のモジュールをアップグレードすると、新しいバージョンをロードする前に生成されたプロセスの内部からsome_funが呼び出されるたびに、最新バージョンのコードが呼び出されます。


お知らせ:モジュールのちょうど2つのバージョン、古いと新しいが存在する場合があります。モジュールの3番目のバージョンがロードされると、コード・サーバーは古いコードを除去(除去)し、その中に残っているすべてのプロセスが終了します。

+4

実際、モジュールの3番目のバージョンがロードされた場合、古いコードのfun(fun f/0の場合)を保持しているプロセスも終了します。 – legoscia

1

?MODULEは、現在のモジュール名に展開される定義済みのマクロです。あなたの場合はsome_modに拡大されます。 fun f/0fun ?MODULE:f/0として参照すると、新しいコンパイルおよびロードされたバージョンsome_modが利用可能なときは常に、新しいバージョンf/0が使用されます。 Erlang documentationから