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

18.0

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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow