Erlang Language
Comportements
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é
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
.