假设我使用:运算符声明一个lua函数,如下所示:
function ClassName:myFunc( stuff )
--do stuff
end
Run Code Online (Sandbox Code Playgroud)
然后说我将该函数存储在一个表中,如下所示:
someTable = {
ClassName.myFunc,
someGlobalFunc,
}
Run Code Online (Sandbox Code Playgroud)
然后,假设我有另一个函数遍历表并尝试调用给定的函数.
function ClassName:callStuffInThisTable(table)
-- I go through the table, which might be someTable above, and call all the functions
end
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何知道表中的函数是否归ClassName所有,以便我可以使用self调用它?
你没有.至少,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,
}
Run Code Online (Sandbox Code Playgroud)
这样,该self参数被忽略.显然,您可以创建一个特殊的函数表对象,该对象具有将"全局"函数插入到表中的功能,该表将自动生成包装器:
function insertFuncIntoTable(self, func)
self[#self + 1] = function(self, ...) func(...) end
end
insertFuncIntoTable(someTable, someGlobalFunc)
Run Code Online (Sandbox Code Playgroud)
注意:这些之间存在差异,假设"someGlobalFunc"实际上是全局表(而不是a local)的成员.此版本将采用_G["someGlobalFunc"] 当前具有的值,就像您的原始代码一样.但是,第一个版本采用它在调用时所具有的值,这可能是与创建时的函数不同的函数someTable.
所以这个版本更安全.
或者,您可以使表中的任何"类函数"显式绑定到对象实例:
someTable = {
function(self, ...) ClassName.myFunc() end,
function(self, ...) return someGlobalFunc(...) end,
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,顺便说一句,如果你使用:语法声明一个函数,你应该通过这种方式使用那个函数instance:myFunc(...).显然它只是一个Lua函数,所以你可以做你喜欢的事情.但滥用可以让人更加了解正在发生的事情.
Lua为你提供了很多力量.但是在编码时你仍然需要运用判断力和纪律.Lua不会(完全)拯救你.
| 归档时间: |
|
| 查看次数: |
515 次 |
| 最近记录: |