Erlang Language
行動
サーチ…
ビヘイビアを使用する
モジュールに-behaviourディレクティブを追加して、動作に従うことを示します。
-behaviour(gen_server).
アメリカのスペルはまた受け入れられる:
-behavior(gen_server).
コンパイラは、ビヘイビアで必要とされる関数の実装やエクスポートを忘れた場合、警告を出します。例:
foo.erl:2: Warning: undefined callback function init/1 (behaviour 'gen_server')
ビヘイビアの定義
モジュールに-callbackディレクティブを追加することで、独自の動作を定義することができます。例えば、あなたの振る舞いを実装するモジュールが、整数をとり、アトムを返すfoo関数を持つ必要がある場合:
-module(my_behaviour).
-callback foo(integer()) -> atom().
この動作を別のモジュールで使用すると、コンパイラはfoo/1エクスポートしないと警告し、型が正しくない場合にDialyzerが警告します。このモジュールでは:
-module(bar).
-behaviour(my_behaviour).
-export([foo/1]).
foo([]) ->
{}.
dialyzer --src bar.erl my_behaviour.erlを実行すると、次の警告が表示されます。
bar.erl:5: The inferred type for the 1st argument of foo/1 ([]) is not a supertype of integer(), which is expected type for this argument in the callback of the my_behaviour behaviour
bar.erl:5: The inferred return type of foo/1 ({}) has nothing in common with atom(), which is the expected return type for the callback of my_behaviour behaviour
カスタムビヘイビアにおけるオプションのコールバック
デフォルトでは、ビヘイビア・モジュールの-callbackディレクティブで指定された関数は、そのビヘイビアを実装するモジュールによってエクスポートされなければなりません。それ以外の場合は、コンパイラの警告が表示されます。
場合によっては、コールバック関数をオプションにしたい場合があります。ビヘイビアは、存在する場合はそれを使用してエクスポートし、そうでない場合はデフォルトの実装にフォールバックします。これを行うには、書き込み-callbackいつものように指示をした後にコールバック関数をリスト-optional_callbacksディレクティブ:
-callback bar() -> ok.
-optional_callbacks([bar/0]).
モジュールがbar/0をエクスポートすると、Dialyzerは引き続き型指定をチェックしますが、関数が存在しない場合、コンパイラの警告は出ません。
Erlang / OTP自体では、これはgen_server 、 gen_fsm 、およびgen_event動作のformat_statusコールバック関数に対して行われます。