Erlang Language
Zachowania
Szukaj…
Korzystanie z zachowania
Dodaj dyrektywę -behaviour
do swojego modułu, aby wskazać, że zachowuje się tak:
-behaviour(gen_server).
Akceptowana jest także amerykańska pisownia:
-behavior(gen_server).
Teraz kompilator wyświetli ostrzeżenie, jeśli zapomniałeś zaimplementować i wyeksportować dowolne funkcje wymagane przez zachowanie, np .:
foo.erl:2: Warning: undefined callback function init/1 (behaviour 'gen_server')
Definiowanie zachowania
Możesz zdefiniować własne zachowanie, dodając dyrektywy -callback
w swoim module. Na przykład, jeśli moduły implementujące twoje zachowanie muszą mieć funkcję foo
która przyjmuje liczbę całkowitą i zwraca atom:
-module(my_behaviour).
-callback foo(integer()) -> atom().
Jeśli użyjesz tego zachowania w innym module, kompilator wyświetli ostrzeżenie, jeśli nie wyeksportuje foo/1
, a Dialyzer ostrzeże, jeśli typy nie są poprawne. Za pomocą tego modułu:
-module(bar).
-behaviour(my_behaviour).
-export([foo/1]).
foo([]) ->
{}.
i uruchamiając dialyzer --src bar.erl my_behaviour.erl
, otrzymujesz te ostrzeżenia:
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
Opcjonalne wywołania zwrotne w niestandardowym zachowaniu
Domyślnie każda funkcja określona w dyrektywie -callback
w module zachowania musi zostać wyeksportowana przez moduł, który implementuje to zachowanie. W przeciwnym razie pojawi się ostrzeżenie kompilatora.
Czasami chcesz, aby funkcja wywołania zwrotnego była opcjonalna: zachowanie użyłoby jej, gdyby było obecne i wyeksportowane, a w przeciwnym razie polegałoby na domyślnej implementacji. Aby to zrobić, napisz jak zwykle dyrektywę -callback
, a następnie -callback
listę funkcji zwrotnej w dyrektywie -optional_callbacks
:
-callback bar() -> ok.
-optional_callbacks([bar/0]).
Jeśli moduł eksportuje bar/0
, Dialyzer nadal sprawdza specyfikację typu, ale jeśli funkcja jest nieobecna, nie pojawi się ostrzeżenie kompilatora.
W samym Erlang / OTP odbywa się to dla funkcji zwrotnej format_status
w zachowaniach gen_server
, gen_fsm
i gen_event
.