Recherche…


Utiliser un comportement

Ajoutez une directive -behaviour à votre module pour indiquer qu'il suit un comportement:

-behaviour(gen_server).

L'orthographe américaine est également acceptée:

-behavior(gen_server).

Maintenant, le compilateur vous avertira si vous avez oublié d'implémenter et d'exporter l'une des fonctions requises par le comportement, par exemple:

foo.erl:2: Warning: undefined callback function init/1 (behaviour 'gen_server')

Définir un comportement

Vous pouvez définir votre propre comportement en ajoutant des directives -callback dans votre module. Par exemple, si les modules implémentant votre comportement doivent avoir une fonction foo qui prend un entier et renvoie un atome:

-module(my_behaviour).
-callback foo(integer()) -> atom().

Si vous utilisez ce comportement dans un autre module, le compilateur avertira s'il n'exporte pas foo/1 et Dialyzer avertit si les types ne sont pas corrects. Avec ce module:

-module(bar).
-behaviour(my_behaviour).
-export([foo/1]).

foo([]) ->
    {}.

et en exécutant dialyzer --src bar.erl my_behaviour.erl , vous obtenez ces avertissements:

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

Rappels facultatifs dans un comportement personnalisé

18,0

Par défaut, toute fonction spécifiée dans une directive -callback dans un module de comportement doit être exportée par un module qui implémente ce comportement. Sinon, vous obtiendrez un avertissement du compilateur.

Parfois, vous souhaitez qu'une fonction de rappel soit facultative: le comportement l'utilise si elle est présente et exportée et, autrement, elle utilise une implémentation par défaut. Pour ce faire, écrivez la directive -callback comme d'habitude, puis répertoriez la fonction de rappel dans une directive -optional_callbacks :

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

Si le module exporte bar/0 , Dialyzer vérifiera toujours la spécification de type, mais si la fonction est absente, vous ne recevrez pas d'avertissement du compilateur.

Dans Erlang / OTP lui-même, cela est fait pour la fonction de rappel format_status dans les gen_server , gen_fsm et gen_event .



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow