相信接触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自身