在研究cocos2d lua引擎源码的时候,看到framework\cc\components\Component.lua中有这段代码
function Component:exportMethods_(methods)
self.exportedMethods_ = methods
local target = self.target_
local com = self
for _, key in ipairs(methods) do
if not target[key] then
local m = com[key]
target[key] = function(__, ...)
return m(com, ...)
end
end
end
return self
end
当时就感觉奇怪,”
target[key] = function(__, ...)
“为什么要写成这样,直接target[key] = function(...)不就成了吗。这让我想起引擎中的类的方法定义,通常都是xxclass:xxfun(...),据说":"这个符号的意思是把拥有这个方法的实例指针当成第一个参数并传递给xxfun,后面再添加"..."的参数。下面举了些例子,会更加直观。我们先在一个类中定义一个方法:
function MyApp:okwell(...)
if self ~= nil then
if type(self)=="table" then
print("self is table")
else
print("self is:"..self)
end
else
print("self is nil")
end
local args = {...}
for n,m in ipairs(args) do
if type(m) ~= "table" then
print(n..">>>>>>"..m)
end
end
end
然后在function MyApp:ctor()中加一句self:okwell("aa","bb"),运行一下看看结果:
一共打印了三个值,在调用self:okwell("aa","bb")时,它相当于调用self.okwell(self,"aa","bb"),注意这里":"和":"的不同,它实际是发送了三个参数。再来看函数的定义MyApp:okwell(...)意思是我要把接收到的第一个参数设置为self,如果没有参数,self值为nil,当我把第一参数扣除后,后面的才算是本函数的参数,这个方法可以写成MyApp.okWell(self_, ...)。
再来看看,如果我加的代码是self.okwell("aa","bb"),注意是“."不是":"了,看看效果:
self已经不是table而是"aa"了,用类似的方法,我们可以修改 function MyApp:okwell(...)这个方法,把":"改成"."试试,如果改成".",这个方法在执行的时候就没有self这个本地变量了,具体你们多试几次即可理解。
回到正题,target[key] = function(__, ...),意思相当于 target.key(__, ...), 相当于target:key(...),所以当我们要调用这个方法的时候,就类似于引擎里的其他方法一样来调用即可,例如 target:key(a,b,c)。