2016-11-29 143 views
1

功能我使用Lua的游戏引擎中。我经常需要在给定的时间间隔内完成任务,而蛮力的方式就是为我需要做的每件事情做一个变量来跟踪我最后一次做的事情。这使得我的代码变得杂乱无章,因为他们更注重工作而不是面向目标。所以我有一个想法来做一个功能,会自动为我做这个。我需要提供的是间隔和一个函数,我定义了在此间隔内需要完成的内容。 (在我的例子中,我使用“类”,所以我也定义了对象)。唯一标识在Lua

当然,我还需要做出最后的更新变量来跟踪每一个,但如果我能掩盖这个功能里面,然后我的代码写入到使用它只是变得更简单。所以在我传入的obj中,我需要为每次调用函数时的每条语句创建一个唯一变量。我想我可以使用回调函数的字符串名称,但每次都有所不同,因为它是一个匿名函数。 反正从我可以生成一个唯一的变量名,所以我没有使用这个系统时,任何跟踪匿名函数?因为同一个对象不会有2个匿名函数会是相同的,所以函数本身可能会有一些散列?不知道如果你能做到这一点在Lua虽然

function DoEvery(interval, obj, method) 
    -- somehow I need a way to uniquely ID the passed in method so I can make a variable on the passed in obj that tracks it's last time called 
    print(tostring(method)) -- this gives a new address each cycle so that won't work 
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() 
+0

定义命名的本地函数'功能print_name(个体经营)打印(self.name)end'外'脚本:更新()'和'使用DoEvery(250,自我,print_name)''作为脚本:更新( )'身体。因此,每次调用'script:Update()'时,您将在'DoEvery()'函数中具有相同的'method'参数。您可以使用'tostring(method)'或'method'本身作为'script'对象内的键来存储上次访问时间。 –

+0

我希望函数是内联的,所以当你阅读代码时,你不必去别的地方看看发生了什么。我希望它能像lambda表达式那样。 – user441521

+0

再添加一个参数 - 您打算简短说明:'DoEvery(250,“打印名称”,自我,函数(个体经营)......结束)'这个字符串参数将作为一个评论(简化代码的理解)并作为一个独特的关键。 –

回答

2

这种解决方案需要获得debug库和编译来源不剥调试信息(如果您的LUA文件存储为预编译的字节码)。

function DoEvery(interval, obj, method) 
    local info = debug.getinfo(method, "S") 
    local id = info.linedefined..info.source 
    print(id) 
    -- "id" consists of line number and file name 
    -- where "method" function was defined 
    -- so it is unique 
    -- (unless you write two anonymous functions on the same line) 
end 
+0

这个工作在https://www.lua.org/cgi-bin/demo。我会在我的游戏引擎中检查它。如果它在那里有效,那么它就非常出色,我会接受它作为答案。 – user441521

+1

游戏引擎通常无法访问调试库。 –

+0

游戏引擎实际上支持它!这将完美谢谢! – user441521