参考文章:
关于Erlang中的behaviour
erlang 如何自定义 behaviour
behaviour 定义区别
例子中的behaviour区别
my_behaviour 自定义behaviour方式没有类型规范的约束,约束只有函数名和元数
test_behaviour 自定义behaviour方式简化了一些
源代码
-module(my_behaviour). -export([behaviour_info/1]). -export([start/1, stop/0]). behaviour_info(callbacks) -> [ {init, 1}, {handle, 2}]; behaviour_info(_Other) -> undefined. start(Mod) -> State = Mod:init(0), {ok, State2} = Mod:handle(add, State), io:format("state : ~p~n", [State2]). stop() -> stop.
-module(test_behaviour). -export([start/1, stop/0]). -callback init( number() ) -> number(). -callback handle( Event :: atom(), ARG::number() ) -> number(). start(Mod) -> State = Mod:init(0), {ok, State2} = Mod:handle(add, State), io:format("state : ~p~n", [State2]). stop() -> stop.
-module(use_my_behaviour). % -behaviour(my_behaviour). -behaviour(test_behaviour). -export([init/1, handle/2]). init(State) -> io:format("init ~p~n", [State]), State. handle(Request, State) -> io:format("handle request:~p state:~p~n", [Request, State]), State2 = State + 1, {ok, State2}.
结果
结果一:
> c(my_behaviour). {ok,my_behaviour} 5> c(use_my_behaviour). {ok,use_my_behaviour} 6> my_behaviour:start(use_my_behaviour). init 0 handle request:add state:0 state : 1 ok
结果二:
> c(test_behaviour). {ok,test_behaviour} 16> c(use_my_behaviour). {ok,use_my_behaviour} 17> test_behaviour:start(use_my_behaviour). init 0 handle request:add state:0 state : 1 ok