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
コールバック関数に対して行われます。