如何不实现行为回调函数?

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')**

JNI - 在本机 cpp 回调函数中使用 RxJava 的奇怪行为

js回调函数如何实现异步,给一个例子

杂谈 —— 接口与回调的联系

如何将回调和中断服务函数进行结合?