你不知道。至少,Lua不會告訴你。
function ClassName:myFunc(stuff)
就Lua而言,它只是句法糖。這與此沒有什麼不同:ClassName.myFunc = function (self, stuff)
。這些功能是等同的。 同樣,對於:call語法,ClassName:myFunc(stuff)
在語義上等同於ClassName.myFunc(ClassName, stuff)
。
這是高達你知道你的功能是什麼,他們做什麼。這需要編碼規範。如果您有一個需要在循環中調用的函數列表,則應該將它們設計爲使用相同的參數進行調用。
有兩種方法可以做到這一點。一種方法是讓所有的功能,「類函數」:
someTable = {
ClassName.myFunc,
function(self, ...) return someGlobalFunc(...) end,
}
這樣,self
參數被忽略。顯然,你可以創建一個具有以下功能:用於插入「全球性」的功能到表將自動生成包裝一個特殊的函數表對象:
function insertFuncIntoTable(self, func)
self[#self + 1] = function(self, ...) func(...) end
end
insertFuncIntoTable(someTable, someGlobalFunc)
注:有這之間的差異,假設「someGlobalFunc」是實際上是全球表格的成員(而不是local
)。此版本將採用_G["someGlobalFunc"]
目前的值,就像您的原始代碼一樣。但是,第一個版本的值爲,它被稱爲,它可能與創建時的someTable
時間不同。
所以這個版本更安全。
或者,你可以讓這個表中的任何「類函數」明確綁定到一個對象實例:
someTable = {
function(self, ...) ClassName.myFunc() end,
function(self, ...) return someGlobalFunc(...) end,
}
順便說一句,在一般情況下,如果使用:
語法聲明函數,你'使用這樣的功能,通過instance:myFunc(...)
。顯然它只是一個Lua函數,所以你可以做你喜歡的。但濫用可以讓人更難理解正在發生的事情。
Lua爲您提供了很多動力。但是在編碼時你仍然需要做出判斷和紀律。 Lua不會完全保存你自己。
出於好奇,爲什麼你想要/需要調用所有的函數在給定的表) ,你不能也要求所有這些函數都是*所有*是類方法或*所有*是裸函數? – Amber 2012-04-04 23:32:14