サーチ…


ビヘイビアを使用する

モジュールに-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

カスタムビヘイビアにおけるオプションのコールバック

18.0

デフォルトでは、ビヘイビア・モジュールの-callbackディレクティブで指定された関数は、そのビヘイビアを実装するモジュールによってエクスポートされなければなりません。それ以外の場合は、コンパイラの警告が表示されます。

場合によっては、コールバック関数をオプションにしたい場合があります。ビヘイビアは、存在する場合はそれを使用してエクスポートし、そうでない場合はデフォルトの実装にフォールバックします。これを行うには、書き込み-callbackいつものように指示をした後にコールバック関数をリスト-optional_callbacksディレクティブ:

-callback bar() -> ok.
-optional_callbacks([bar/0]).

モジュールがbar/0をエクスポートすると、Dialyzerは引き続き型指定をチェックしますが、関数が存在しない場合、コンパイラの警告は出ません。

Erlang / OTP自体では、これはgen_servergen_fsm 、およびgen_event動作のformat_statusコールバック関数に対して行われます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow