Erlang Language
beteenden
Sök…
Använda ett beteende
Lägg till ett -behaviour
direktiv till din modul för att indikera att det följer ett beteende:
-behaviour(gen_server).
Den amerikanska stavningen accepteras också:
-behavior(gen_server).
Nu kommer kompilatorn att varna om du har glömt att implementera och exportera någon av funktionerna som krävs av beteendet, t.ex.:
foo.erl:2: Warning: undefined callback function init/1 (behaviour 'gen_server')
Definiera ett beteende
Du kan definiera ditt eget beteende genom att lägga till -callback
direktiv i din modul. Om till exempel moduler som implementerar ditt beteende måste ha en foo
funktion som tar ett heltal och returnerar en atom:
-module(my_behaviour).
-callback foo(integer()) -> atom().
Om du använder detta beteende i en annan modul varnar kompilatorn om den inte exporterar foo/1
och Dialyzer varnar om typerna inte är korrekta. Med den här modulen:
-module(bar).
-behaviour(my_behaviour).
-export([foo/1]).
foo([]) ->
{}.
och kör dialyzer --src bar.erl my_behaviour.erl
, du får dessa varningar:
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
Valfritt återuppringning i ett anpassat beteende
Som standard måste alla funktioner som anges i ett -callback
direktiv i en beteendemodul exporteras av en modul som implementerar det beteendet. Annars får du en kompilatorvarning.
Ibland vill du att en återuppringningsfunktion ska vara valfri: beteendet använder den om den finns och exporteras, och annars faller tillbaka på en standardimplementering. För att göra det skriver du -callback
direktivet som vanligt och listar sedan återuppringningsfunktionen i ett -optional_callbacks
direktiv:
-callback bar() -> ok.
-optional_callbacks([bar/0]).
Om modulen exporterar bar/0
, kommer Dialyzer fortfarande att kontrollera typspecifikationen, men om funktionen är frånvarande får du inte en kompilatorvarning.
I själva Erlang / OTP görs detta för format_status
återuppringningsfunktionen i gen_server
, gen_fsm
och gen_event
beteenden.