首页 > 解决方案 > 检查一个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 结构可能会有所帮助,但我不知道每个部分的含义。

https://www.lua.org/source/5.3/lobject.h.html#Proto

标签: lua

解决方案


我无法取消注册事件处理程序,因为它是匿名的

Lua 中的每个函数都是匿名值。所以你不能取消注册不是因为它是匿名的,而是因为你没有保存对它的任何引用。

没有办法检测EventDispatcher:register()传递的值(function类型)是否也保存在其他地方。因此,如果您确实对同一事件有多个回调,并且您想取消注册一个特定的回调,那么您必须有一种方法来识别该确切的回调函数。

这意味着您应该将函数值保存在某处,以便稍后将其自己的值用作 的标识符unregister(),就像现在一样,或者返回新回调的实例 id,在register()添加回调时生成。无论哪种方式,都需要存储一些东西来EventDispatcher识别确切的回调。


推荐阅读