cocos2dx lua 语法糖之冒号(:)与点号(.)区别与使用

相信接触Lua或者做过cocos2dx lua的朋友,都遇到过这样的迷惑,关于Lua中冒号(:)与点号(.)语法糖,有时候会混乱,或者说一开始不太能适应和理解这里的区别和使用。

今天,就主要围绕着两个点,实际对比一下,并结合案例进行实战,并进行一些相关的拓展!

先来看看下面这段代码:

ObjectData = {}

function ObjectData.count1( self )
    print("ObjectData.count1", self)
end

function ObjectData:count2()
    print("ObjectData:count2", self)
end

a = ObjectData
a.count1() -- nil
a:count1()
a.count1(a)
a:count1(a)

a.count2() -- nil
a:count2()
a.count2(a)
a:count2(a)

我们通过打印,得到下面的结果,是不是有点蒙圈了!

-- ObjectData.count1    nil
-- ObjectData.count1    table: 0x7c06d880
-- ObjectData.count1    table: 0x7c06d880
-- ObjectData.count1    table: 0x7c06d880

-- ObjectData:count2    nil
-- ObjectData:count2    table: 0x7c06d880
-- ObjectData:count2    table: 0x7c06d880
-- ObjectData:count2    table: 0x7c06d880

有了上面的实例,我就可以通过简单的区分来实际应用和对比一下。

方法的点号定义和点号调用。

money = {count = 888}

function money.getCount(money ,somecount)

    money.count = money.count - somecount

end

money.getCount(money ,666)

print(money.count)

冒号定义和冒号调用。

money = {count = 888}

function money:getCount(somecount)

    self.count = self.count - somecount

end

money:getCount(666)

print(money.count)

以上的打印结果都是666。

可以看出,冒号定义和冒号调用其实跟上面的效果一样,只是把第一个隐藏参数省略了,而该参数self指向调用者自身

当然了,我们也可以点号定义冒号调用,或者冒号定义点号调用

money = {count = 888}

function money.getCount(self ,somecount)

    self.count = self.count - somecount

end

money:getCount(666)

print(money.count)     


冒号只是起了省略第一个参数self的作用,该self指向调用者本身,并没有其他特殊的地方。

也有网友提出:用lua进行面向对象的编程,声明方法和调用方法统一用冒号,对于属性的调用全部用点号

  • 由此总结就是:
    • 定义的时候冒号默认接收self参数
    • 调用的时候冒号默认传递调用者自己为参数
    • 而句号要显示传递或接收self参数
    • 冒号会提供一个内置table供function之间通信。
    • 一个点用来定义和取得一个变量,这个变量可能是个函数
    • 两个点用来定义和调用一个函数,两个点会自动传入“调用者”这个table自身 

如果是使用Cocos2d-x lua来开发的话,大部分情况下都是使用冒号的。
原因很简单,因为大部分情况下我们都要使用到self参数,就像C++的this关键字一样。
坚持原创技术分享,您的支持将鼓励我继续创作!