1. 程式人生 > >Erlang OTP 自定義behaviour

Erlang OTP 自定義behaviour

為什麼要使用behaviour,如果您對erlang有所瞭解的話,就明白其中的好處。
可以做到程式碼通用,可以減少錯誤,可以使用很多成熟的久經考驗的模式,可以減輕無謂的重複勞動等等。。
有些時候,你可能需要定義自己的behaviour,這可不僅僅是OTP的權力。
自己定義behaviour非常簡單,僅僅需要幾步。
下面是一個例子:

Erlang 程式碼
  1. -module(my_behaviour).  
  2. -export([behaviour_info/1]).  
  3. behaviour_info(callbacks) ->  
  4.     [{init,1},  
  5.      {handle, 2
    }];  
  6. behaviour_info(_Other) ->  
  7.     undefined.  
  8. -export([start/1, stop/0]).  
  9. start(Mod) ->  
  10.     State = Mod:init(0),  
  11.     {ok, State2} = Mod:handle(add,  State),  
  12.     io:format("state :~p~n", [State2]).  
  13. stop() ->  
  14.     stop.  
12345678910111213141516 -module(my_behaviour).-export([behaviour_info/1]).behaviour_info(callbacks)->[{init,1},{handle,2}];behaviour_info(_Other)->undefined.-export([start/1,stop/0]).start(Mod)->State=Mod:init(0),{ok,State2}=Mod:handle(add,State)
,io:format("state:~p~n",[State2]).stop()->stop.

上面就定義了一個名叫my_behaviour的behaviour,其需要兩個回撥函式:init/1和handle/1,以後在使用這個 behaviour時,只需要export這兩個回撥函式即可。
如:

Erlang 程式碼
  1. -module(use_my_behaviour).  
  2. -behaviour(my_behaviour).  
  3. %%behaviour callback function  
  4. -export([init/1,  handle/2]).  
  5. init(State) ->  
  6.       io:format("init ~p~n", [State]),  
  7.       State.  
  8. handle(Request, State) ->  
  9.       io:format("handle request:~p state:~p", [Request, State]),  
  10.       State2 = State + 1,  
  11.       {ok, state2}.  
1234567891011121314 -module(use_my_behaviour).-behaviour(my_behaviour).%%behaviourcallbackfunction-export([init/1,handle/2]).init(State)->io:format("init~p~n",[State]),State.handle(Request,State)->io:format("handlerequest:~pstate:~p",[Request,State]),State2=State+1,{ok,state2}.


使用:

Erlang 程式碼
  1. $erl  
  2. > my_behaviour:start(use_my_behaviour).  
12 $erl>my_behaviour:start(use_my_behaviour).

為了您的behaviour更易使用,您需要對behaviour的功用和回撥函式的引數,返回值等進行詳細的說明。具體可以參考OTP中 gen_server等behaviour的實現。