lua - 检查一个lua函数是否是匿名的?
问题描述
我在游戏中将回调注册为事件处理程序,如下所示:
--register event handler
EventDispatcher:register("fire", mt.onPlayerFire, self)
--this is the event handler
mt:onPlayerFire()
print("play fire")
end
--unregister event handler
EventDispachter:unregister("fire", mt.onPlayerFire, self)
当事件处理程序是 module 中的函数时mt
,可以取消注册它,因为我可以在其中找到相同的函数mt
来取消注册它,但是当我使用这种形式时:
EventDispatcher:register("fire", function() doSomething() end, nil)
我无法取消注册事件处理程序,因为它是匿名的,所以我想在我的register
函数中添加一些检查以防止匿名函数作为事件处理程序。
我发现 lua 源代码中的 Proto 结构可能会有所帮助,但我不知道每个部分的含义。
解决方案
我无法取消注册事件处理程序,因为它是匿名的
Lua 中的每个函数都是匿名值。所以你不能取消注册不是因为它是匿名的,而是因为你没有保存对它的任何引用。
没有办法检测EventDispatcher:register()
传递的值(function
类型)是否也保存在其他地方。因此,如果您确实对同一事件有多个回调,并且您想取消注册一个特定的回调,那么您必须有一种方法来识别该确切的回调函数。
这意味着您应该将函数值保存在某处,以便稍后将其自己的值用作 的标识符unregister()
,就像现在一样,或者返回新回调的实例 id,在register()
添加回调时生成。无论哪种方式,都需要存储一些东西来EventDispatcher
识别确切的回调。
推荐阅读
- kubernetes - Azure Kubernetes - 使用入口和出口网关设置 Istio?
- react-native - React-native 复选框不适用于 IO
- php - PHP sqlsrv_query 不适用于 SCOPE_IDENTITY()
- youtube - Youtube API C# 错误,无法发表评论?我还应该做什么
- python - 查找一个系列中不属于另一个系列的元素时出错
- c - 递增时的双指针给出不同的地址
- java - 为什么我通过 TCP 发送的文件包含的数据比它自己包含的文件多?
- java - 递增/递减混淆
- ios - 如何没有 Xamarin.ios spash 并且没有显示
- javascript - 如何在 if-else 语句中调用函数?