Lua中用于独特标识函数的方法

我在一个游戏引擎中使用Lua。我经常需要按照给定的间隔执行任务,但是采用暴力的方式是为我需要执行的每个任务制作一个变量来跟踪上次执行的时间。这会使我的代码变得混乱,因为这些变量更注重工作而不是意图。因此,我想到了一种方法,可以自动地为我完成这些操作的函数。我只需要提供间隔和一个我内联定义所需的要在此间隔内完成的任务的函数。(在我的示例中我使用classes,因此我还定义了对象)。\n\n当然,我仍然需要制作最后更新变量来跟踪每个任务,但如果我可以在这个函数内部将其掩盖,那么使用它需要编写的代码就会变得更简单。因此,在传入的obj上,我需要为我调用函数的每个语句制作一个独特的变量。我想我可以使用回调函数的字符串名称,但每次都不同,因为它是一个匿名函数。从匿名函数中有没有一种方法来生成一个唯一的变量名,使得在使用此系统时不必跟踪任何东西?由于同一对象的两个匿名函数是不同的,可能会对函数本身进行某种哈希,但不确定能否在Lua中实现。\n\n``` function DoEvery(interval,obj,method) -- 我需要一种方法来唯一地标识传入的方法,以便我可以在传入的obj上制作一个变量,跟踪它的上次调用时间 print(tostring(method)) -- 这会在每个循环中给出一个新的地址,因此不起作用 end

Script = {}

function Script:Create() local obj = {}

obj.name = "Mike"

for k,v in pairs(Script) do obj[k] = v end

return obj end

function Script:Update() DoEvery(250,self,function(self) print(self.name) end) end

local script = Script:Create()

script:Update() script:Update() script:Update()

```

点赞
用户1847592
用户1847592

这个解决方案需要访问 debug 库以及在编译源代码的时候不剥夺调试信息(如果您的 Lua 文件以预编译字节码存储)。

function DoEvery(interval, obj, method)
   local info = debug.getinfo(method, "S")
   local id = info.linedefined..info.source
   print(id)
   -- "id" 由行号和文件名组成,
   -- “method” 函数被定义的地方,
   -- 因此它是唯一的,
   -- (除非您在同一行上写下两个匿名函数)。
end
2016-11-29 21:10:33