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

18,0

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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow