為什麼要使用behaviour,如果您對erlang有所瞭解的話,就明白其中的好處。
可以做到代碼通用,可以減少錯誤,可以使用很多成熟的久經考驗的模式,可以減輕無謂的重複勞動等等。。
有些時候,你可能需要定義自己的behaviour,這可不僅僅是OTP的權力。
自己定義behaviour非常簡單,僅僅需要幾步。
下面是一個例子:
Erlang 代碼
- -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.
-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 代碼
- -module(use_my_behaviour).
- -behaviour(my_behaviour).
- %%behaviour callback function
- -export([init/1, handle/2]).
-
- init(State) ->
- io:format("init ~p~n", [State]),
- State.
-
- handle(Request, State) ->
- io:format("handle request:~p state:~p", [Request, State]),
- State2 = State + 1,
- {ok, state2}.
-module(use_my_behaviour).-behaviour(my_behaviour).%%behaviour callback function-export([init/1, handle/2]).init(State) -> io:format("init ~p~n", [State]), State.handle(Request, State) -> io:format("handle request:~p state:~p", [Request, State]), State2 = State + 1, {ok, state2}.
使用:
Erlang 代碼
- $erl
- > my_behaviour:start(use_my_behaviour).
$erl> my_behaviour:start(use_my_behaviour).
為了您的behaviour更易使用,您需要對behaviour的功用和回呼函數的參數,傳回值等進行詳細的說明。具體可以參考OTP中 gen_server等behaviour的實現。
轉載:http://clay.phpme.info/?app=article&id=1276