用户定义的行为

要实现一个用户定义的行为,可以编写和特殊进程类似的代码但要调用回掉模块中的函数来处理特殊任务。

如果想要编译器对缺少的回掉函数提出警告——也就是OTP行为的作为,那么需要实现和输出下面这个函数:

  1. behaviour_info(callbacks) ->
  2. [{Name1, Arity1},...,{NameN,ArityN}].

其中每个 {Name,Arity} 指定了一个回调函数的名称和基数。

当编译器在某个模块 Mod 中 遇到了模块属性 -behaviour(Behaviour). 后,它会调用 Behaviour:behaviour_info(callbacks) 并且将结果与从 Mod 实际导出的函数集相对比,然后如果有任何缺少的回调函数则给出警告。

例子:

  1. %% User-defined behaviour module
  2. -module(simple_server).
  3. -export([start_link/2,...]).
  4. -export([behaviour_info/1]).
  5.  
  6. behaviour_info(callbacks) ->
  7. [{init,1},
  8. {handle_req,1},
  9. {terminate,0}].
  10.  
  11. start_link(Name, Module) ->
  12. proc_lib:start_link(?MODULE, init, [self(), Name, Module]).
  13.  
  14. init(Parent, Name, Module) ->
  15. register(Name, self()),
  16. ...,
  17. Dbg = sys:debug_options([]),
  18. proc_lib:init_ack(Parent, {ok, self()}),
  19. loop(Parent, Module, Deb, ...).
  20.  
  21. ...

回调模块中:

  1. -module(db).
  2. -behaviour(simple_server).
  3.  
  4. -export([init/0, handle_req/1, terminate/0]).
  5.  
  6. ...