Erlang Language
gedragingen
Zoeken…
Gedrag gebruiken
Voeg een -behaviour
aan uw module om aan te geven dat deze een gedrag volgt:
-behaviour(gen_server).
De Amerikaanse spelling wordt ook geaccepteerd:
-behavior(gen_server).
Nu geeft de compiler een waarschuwing als u bent vergeten een van de functies te implementeren en te exporteren die nodig zijn voor het gedrag, bijvoorbeeld:
foo.erl:2: Warning: undefined callback function init/1 (behaviour 'gen_server')
Gedrag definiëren
U kunt uw eigen gedrag definiëren door -callback
richtlijnen aan uw module toe te voegen. Als modules die uw gedrag implementeren bijvoorbeeld een foo
functie moeten hebben die een geheel getal gebruikt en een atoom retourneert:
-module(my_behaviour).
-callback foo(integer()) -> atom().
Als u dit gedrag in een andere module gebruikt, waarschuwt de compiler dat foo/1
niet wordt geëxporteerd en Dialyzer waarschuwt als de typen niet correct zijn. Met deze module:
-module(bar).
-behaviour(my_behaviour).
-export([foo/1]).
foo([]) ->
{}.
en met dialyzer --src bar.erl my_behaviour.erl
, krijg je deze waarschuwingen:
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
Optionele callbacks in een aangepast gedrag
Standaard moet elke functie die is opgegeven in een -callback
instructie in een gedragsmodule worden geëxporteerd door een module die dat gedrag implementeert. Anders krijgt u een compilerwaarschuwing.
Soms wilt u dat een callback-functie optioneel is: het gedrag gebruikt deze indien aanwezig en geëxporteerd en valt anders terug op een standaardimplementatie. Om dat te doen, schrijft u de -callback
instructie zoals gewoonlijk en geeft u de callback-functie weer in een -optional_callbacks
instructie:
-callback bar() -> ok.
-optional_callbacks([bar/0]).
Als de module bar/0
exporteert, zal Dialyzer nog steeds de typespecificatie controleren, maar als de functie afwezig is, krijgt u geen compilerwaarschuwing.
In Erlang / OTP zelf, wordt dit gedaan voor de format_status
callback functie in de gen_server
, gen_fsm
en gen_event
gedrag.