来自:http://blog.csdn.net/stormbjm/article/details/38532413
定义的时候冒号默认接收self参数
调用的时候冒号默认传递调用者自己为参数
而句号要显示传递或接收self参数
-- 例如:句号定义,需要显示传递或接收
- a = { x = 1 }
- function a.fun(self)
- print(self.x)
- end
- a.fun(a)--输出1,将a自己做为参数传给fun函数的self
将函数定义改成冒号,就可以省略self参数
- function a:fun()
- print(self.x)
- end
- a.fun(a)
- function a:fun()
- print(self.x)
- end
- a:fun()
最后说明一下,如果不用self,直接在函数里使用x是不行的
之前以为可以像c++类一样,成员函数可以直接使用类成员变量
- function a:fun()
- print(x)--将输出nil,找不到这个x
- end
lua本身没有类功能,它的类功能是通过元表来实现的。类的函数调用通过obj:function方式。但类的成员赋值又是通过obj.var方式来实现的。翻阅lua 5.1手册,发现对于冒号只有这么一段解释。(
lua 5.1手册)
冒号语法可以用来定义方法, 就是说,函数可以有一个隐式的形参 self。 因此,如下写法:
function t.a.b.c:f (params) body end
是这样一种写法的语法糖:
t.a.b.c.f = function (self, params) body end
function t.a.b.c:f (params) body end
是这样一种写法的语法糖:
t.a.b.c.f = function (self, params) body end
然后我做了如下测试,来弄清楚冒号的用法
- function test()
- t.f()
- t:g()
- t:h()
- t.i()
- t:h()
- t.j(t)
- t:h()
- end
- t = {}
- function t.f()
- print("tf");
- end
- function t:g()
- self.x = 10
- end
- function t:h()
- print(self.x)
- end
- function t.i()
- t.x = 20
- end
- function t.j(k)
- k.x = 30
- end
[LUA-print] tf
[LUA-print] 10
[LUA-print] 20
[LUA-print] 30
[LUA-print] 10
[LUA-print] 20
[LUA-print] 30
发现冒号会提供一个内置table供function之间通信。