如何不实现行为回调函数?
Posted
技术标签:
【中文标题】如何不实现行为回调函数?【英文标题】:How to leave behavior callback functions unimplemented? 【发布时间】:2019-10-07 10:42:21 【问题描述】:假设我有一个gen_server
:
-module(myserver).
-behavior(gen_server).
-export([init/1, handle_call/3]).
init(Arg) -> % ...
handle_call(Request, From, State) -> % ...
编译它自然会产生警告:
myserver.erl:2: Warning: undefined callback function handle_cast/2 (behaviour 'gen_server')
如果我的服务器不需要handle_cast/2
,我该如何处理这个警告?我是否定义一个占位符函数只是为了满足编译器?例如:
handle_cast(_Request, _State) -> unimplemented.
或者我是否忽略/抑制警告消息?
编写gen_server
的正确方法是什么,而不是使用所有回调函数?
【问题讨论】:
【参考方案1】:我们不应该忽略警告消息,这使我们以后很难跟踪应用程序中的错误/错误。保留占位符功能是一种更好的方法,但应该如下所示:
handle_cast(_Msg, State) ->
noreply, State.
默认情况下,该函数不会向调用者提供数据,因此您或您的同事使用gen_sever:cast/2
时可以避免应用程序崩溃。
我没有具体的写法gen_sever
。在我工作的一个大项目中,他们只是留下如下的占位符以供将来使用。他们不太关心是否使用回调函数。我们应该注意是否使用普通函数而不是回调函数。
handle_call(_Request, _From, State) ->
reply, ok, State.
handle_cast(_Msg, State) ->
noreply, State.
handle_info(_Info, State) ->
noreply, State.
terminate(_Reason, _State) ->
ok.
【讨论】:
是否建议将日志记录添加到本应未使用的回调函数中,以便它们的无意使用会出现在日志中? 如果编译时这个警告不打扰你,那么就忽略它们。我只是想说你忽略cast
并留下这样的unimplemented
。您将来可能需要cast
。【参考方案2】:
如果我的服务器不需要,我该如何处理这个警告 handle_cast/2?
那么您的服务器不是gen_server
,因此您可以删除该行:
-behavior(gen_server).
这是导致编译器检查 gen_server
回调函数是否存在的原因。
底线是 OTP 要求您的代码和 OTP 行为之间有一个契约。如果您不想遵守合同,那么您不能使用 OTP 行为。换句话说,您需要实现所有回调函数。
是否建议将日志记录添加到假定未使用的回调中 功能,以便它们的无意使用会出现在日志中?
这取决于你。对我来说这听起来是个好主意。
【讨论】:
以上是关于如何不实现行为回调函数?的主要内容,如果未能解决你的问题,请参考以下文章
java里面,c里面都有回调函数,回调函数都是啥东西啊???
警告:未定义的回调函数终止/3(行为'gen_statem')**