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

在研究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)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值