深入理解lua中的"."和":"

来源:互联网 发布:网络音乐版权 编辑:程序博客网 时间:2024/05/17 23:10
在研究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 selfend


当时就感觉奇怪,”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    endend


然后在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)。
原创粉丝点击