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

18,0

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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow