大概从 Erlang17.0 开始吧,有些变化。 在自定义 behaviour 的时候,在之前需要定义一个函数:behaviour_info 函数来返回需要满足的函数签名。但是现在这个函数已经被移到 stdlib 了。 在 sasl-3.0.2 里面可以找到如下注释
%%% The behaviour_info functions have been moved to erl_internal in stdlib.
在 cowboy 里面,来看一下如何定义一个 behaviour,这个 cowboy_sub_protocol 可以处理从 http 协议升级到 websocket 协议。
-module(cowboy_sub_protocol).
-callback upgrade(Req, Env, module(), any())
-> {ok, Req, Env} | {suspend, module(), atom(), [any()]} | {stop, Req}
when Req::cowboy_req:req(), Env::cowboy_middleware:env().
-callback upgrade(Req, Env, module(), any(), any())
-> {ok, Req, Env} | {suspend, module(), atom(), [any()]} | {stop, Req}
when Req::cowboy_req:req(), Env::cowboy_middleware:env().
这里便有了一个 cowboy_sub_protocol