수색…


비헤이비어 사용

모듈에 -behaviour 지시문을 추가하여 -behaviour 을 나타냅니다.

-behaviour(gen_server).

미국식 철자법도 허용됩니다.

-behavior(gen_server).

이제 컴파일러는 동작에 필요한 함수를 구현하고 내보내는 것을 잊어 버린 경우 경고를 표시합니다. 예 :

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

비헤이비어 정의

모듈에 -callback 지시문을 추가하여 자신의 동작을 정의 할 수 있습니다. 예를 들어, 당신의 행동을 구현하는 모듈이 정수를 취하고 원자를 반환하는 foo 함수를 가질 필요가 있다면 :

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

다른 모듈에서이 동작을 사용하면 foo/1 내보내지 않으면 컴파일러에서 경고하고 형식이 올바르지 않으면 Dialyzer가 경고합니다. 이 모듈로 :

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

foo([]) ->
    {}.

dialyzer --src bar.erl my_behaviour.erl 실행하면 다음과 같은 경고 메시지가 나타납니다.

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

사용자 정의 비헤이비어의 선택적 콜백

18.0

기본적으로 비헤이비어 모듈의 -callback 지시문에 지정된 함수는 해당 비헤이비어를 구현하는 모듈에서 내 보내야합니다. 그렇지 않으면 컴파일러 경고가 표시됩니다.

경우에 따라 콜백 함수를 선택적으로 사용하려는 경우가 있습니다.이 경우 비헤이비어가있는 경우 해당 비헤이비어를 사용하고 내 보낸 다음 기본 구현을 사용합니다. 그렇게하려면 쓰기 -callback 평소와 같이 지시를 한 다음에 콜백 함수를 나열 -optional_callbacks 지침 :

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

모듈이 bar/0 을 내 보내면 Dialyzer는 유형 스펙을 계속 확인하지만 함수가 없으면 컴파일러 경고를 얻지 못합니다.

Erlang / OTP 자체에서는 gen_server , gen_fsmgen_event 비헤이비어의 format_status 콜백 함수에 대해 수행됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow