2011-06-27 50 views
1

當我開始看OTP的時候,基本上有三種行爲,gen_server,FSM,event, 但是有一個inets應用的例子,我看到它定義了一個自定義行爲 -behavior(inets_service)。那麼用戶如何定義一個定製的行爲,它可以爲你做什麼?如何在Erlang中定義自定義行爲以及它可以爲您做些什麼?

+0

「對於瀏覽此頁面的人:」下面的答案可能會改變,因爲定義自定義行爲的方法在Erlang R14 otp發佈後發生了變化。 https://erlangcentral.org/wiki/index.php?title=Defining_Your_Own_Behaviour可能會提供一些信息 –

+0

關於此問題的更新討論(附帶示例)在這裏:http://stackoverflow.com/questions/32336854/how-to -use-a-call-function-in-erlang-behavior/32337438#32337438 – zxq9

回答

4

定製行爲允許您指定合同。這個合同是由實現該行爲的模塊中必須存在的函數名稱/元素列表給出的。確保您聲明所有功能基本上是方便的。

舉例來說,您可以定義一個具有gen_server行爲的模塊,然後從中省略handle_info/2函數。行爲檢查會因爲缺少合同的一部分而出錯。

這就是它的全部!爲了實現它們,在行爲定義模塊behavior_info/1中定義了一個特殊功能,告訴Erlang系統有關行爲的信息。

inets定義了一個inets_service行爲,因爲它然後作爲inets系統的插頭合同。

+0

如果定義一個gen_server行爲並忽略它的handle_info/2。行爲檢查將**警告**不是**錯誤**。 – mingchaoyan

0

牛仔演示

-module(cowboy_middleware). 

-type env() :: [{atom(), any()}]. 
-export_type([env/0]). 

-callback execute(Req, Env) 
    -> {ok, Req, Env} 
    | {suspend, module(), atom(), [any()]} 
    | {halt, Req} 
    | {error, cowboy:http_status(), Req} 
    when Req::cowboy_req:req(), Env::env(). 

二郎使用-callback定製的品行。

相關問題