定义行为

你可以通过在模块中添加 -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