2016-11-29 141 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