2011-06-27 8 views
1

私はOTPを見始めると、gen_server、FSM、eventという基本的に3つの動作がありますが、inetsアプリケーションの例があります。カスタマイズされた動作が定義されていることがわかりました(動作は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-callback-function-in-erlang-behavior/32337438#32337438 – zxq9

答えて

4

カスタムビヘイビアでは、契約を指定できます。この契約は、その動作を実装するモジュール内に存在しなければならない関数名/属性のリストによって与えられます。基本的には、すべての関数を宣言していることを確認するだけの利便性です。

例として、gen_serverの動作を持つモジュールを定義してから、handle_info/2関数を省略することができます。あなたが契約の一部を欠いているので、行動チェックはエラーになります。

これがすべてです!それらを実装するために、振る舞いを定義する振る舞い定義モジュールbehavior_info/1に特別な関数を定義しています。この関数はErlangシステムに振る舞いを伝えます。

inetsは、inetsシステムへのpluginの契約として機能するため、inets_serviceの動作を定義しています。カスタムbehavious -callback使用

+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(). 

アーラン。

関連する問題