Erlang Language
comportamenti
Ricerca…
Usando un comportamento
Aggiungi una direttiva -behaviour
al tuo modulo per indicare che segue un comportamento:
-behaviour(gen_server).
L'ortografia americana è anche accettata:
-behavior(gen_server).
Ora il compilatore ti avviserà se hai dimenticato di implementare ed esportare le funzioni richieste dal comportamento, ad esempio:
foo.erl:2: Warning: undefined callback function init/1 (behaviour 'gen_server')
Definire un comportamento
Puoi definire il tuo comportamento aggiungendo -callback
direttive -callback
nel tuo modulo. Ad esempio, se i moduli che implementano il tuo comportamento devono avere una funzione foo
che prende un intero e restituisce un atomo:
-module(my_behaviour).
-callback foo(integer()) -> atom().
Se si utilizza questo comportamento in un altro modulo, il compilatore avviserà se non esporta foo/1
e Dialyzer avviserà se i tipi non sono corretti. Con questo modulo:
-module(bar).
-behaviour(my_behaviour).
-export([foo/1]).
foo([]) ->
{}.
e in esecuzione dialyzer --src bar.erl my_behaviour.erl
, ottieni questi avvertimenti:
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
Richiami opzionali in un comportamento personalizzato
Per impostazione predefinita, qualsiasi funzione specificata in una direttiva -callback
in un modulo comportamentale deve essere esportata da un modulo che implementa tale comportamento. Altrimenti, riceverai un avvertimento sul compilatore.
A volte, si desidera che una funzione di callback sia facoltativa: il comportamento lo userebbe se presente ed esportato, e in caso contrario ricadrebbe su un'implementazione predefinita. Per fare ciò, scrivere la direttiva -callback
come al solito, quindi elencare la funzione di callback in una direttiva -optional_callbacks
:
-callback bar() -> ok.
-optional_callbacks([bar/0]).
Se il modulo esporta la bar/0
, Dialyzer controllerà comunque le specifiche del tipo, ma se la funzione è assente, non verrà visualizzato un avviso del compilatore.
In Erlang / OTP sé, questo è fatto per il format_status
funzione di richiamata nei gen_server
, gen_fsm
e gen_event
comportamenti.