Suche…


Verhalten verwenden

Fügen Sie Ihrem Modul eine -behaviour Direktive hinzu, um anzuzeigen, dass es einem Verhalten folgt:

-behaviour(gen_server).

Die amerikanische Schreibweise wird ebenfalls akzeptiert:

-behavior(gen_server).

Der Compiler gibt jetzt eine Warnung aus, wenn Sie vergessen haben, die für das Verhalten erforderlichen Funktionen zu implementieren und zu exportieren, z.

foo.erl:2: Warning: undefined callback function init/1 (behaviour 'gen_server')

Verhalten definieren

Sie können Ihr eigenes Verhalten definieren, indem -callback in Ihrem Modul -callback Anweisungen hinzufügen. Wenn zum Beispiel Module, die Ihr Verhalten implementieren, eine foo Funktion haben müssen, die eine Ganzzahl annimmt und ein Atom zurückgibt:

-module(my_behaviour).
-callback foo(integer()) -> atom().

Wenn Sie dieses Verhalten in einem anderen Modul verwenden, gibt der Compiler eine Warnung aus, wenn foo/1 nicht exportiert wird. Der Dialyzer gibt eine Warnung aus, wenn die Typen nicht korrekt sind. Mit diesem Modul:

-module(bar).
-behaviour(my_behaviour).
-export([foo/1]).

foo([]) ->
    {}.

und laufendem dialyzer --src bar.erl my_behaviour.erl Sie folgende Warnungen:

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

Optionale Rückrufe in einem benutzerdefinierten Verhalten

18,0

Standardmäßig muss jede in einer -callback Direktive in einem Verhaltensmodul angegebene Funktion von einem Modul exportiert werden, das dieses Verhalten implementiert. Andernfalls erhalten Sie eine Compiler-Warnung.

Manchmal möchten Sie, dass eine Rückruffunktion optional ist: Das Verhalten würde sie verwenden, wenn sie vorhanden und exportiert ist, und auf eine Standardimplementierung zurückgreifen. Schreiben -callback wie üblich die Direktive -callback und listen Sie dann die Callback-Funktion in einer Direktive -optional_callbacks :

-callback bar() -> ok.
-optional_callbacks([bar/0]).

Wenn das Modul bar/0 exportiert, überprüft der Dialyzer weiterhin die Typspezifikation. Wenn die Funktion jedoch nicht vorhanden ist, wird keine Compiler-Warnung angezeigt.

In Erlang / OTP selbst, ist dies für die getan format_status Callback - Funktion in den gen_server , gen_fsm und gen_event Verhaltensweisen.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow