Buscar..


Usando un comportamiento

Agregue una directiva -behaviour a su módulo para indicar que sigue un comportamiento:

-behaviour(gen_server).

La ortografía americana también es aceptada:

-behavior(gen_server).

Ahora el compilador dará una advertencia si ha olvidado implementar y exportar cualquiera de las funciones requeridas por el comportamiento, por ejemplo:

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

Definiendo un comportamiento

Puede definir su propio comportamiento agregando directivas de -callback en su módulo. Por ejemplo, si los módulos que implementan su comportamiento necesitan tener una función foo que tome un entero y devuelva un átomo:

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

Si usa este comportamiento en otro módulo, el compilador avisará si no exporta foo/1 , y Dialyzer avisará si los tipos no son correctos. Con este módulo:

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

foo([]) ->
    {}.

y ejecutando dialyzer --src bar.erl my_behaviour.erl , obtienes estas advertencias:

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

Retrollamadas opcionales en un comportamiento personalizado

18.0

De forma predeterminada, cualquier función especificada en una directiva -callback en un módulo de comportamiento debe ser exportada por un módulo que implemente ese comportamiento. De lo contrario, obtendrá una advertencia del compilador.

A veces, desea que una función de devolución de llamada sea opcional: el comportamiento lo usaría si estuviera presente y exportado, y de lo contrario recurriría a una implementación predeterminada. Para hacerlo, escriba la directiva -callback como de costumbre, y luego enumere la función de devolución de llamada en una directiva -optional_callbacks :

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

Si el módulo exporta la bar/0 , Dialyzer seguirá verificando la especificación de tipo, pero si la función está ausente, no recibirá una advertencia del compilador.

En Erlang / OTP, esto se hace para la función de devolución de llamada format_status en los gen_server , gen_fsm y gen_event .



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow