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

18,0

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 .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow