转载自:https://blog.youkuaiyun.com/daimou123/article/details/50689623
在lua中使用“:”定义的函数会自动传入一个名为self的变量,这个变量是隐含的,self同c++中的this一样,表示当前对象的指针,而“.”定义的函数中没有self。
function class:func2( ) end
function class.func1(self) end
--这时候这两个函数等价
一般情况下,用:来定义的函数,调用时最好用:来调用,用 . 来定义的函数调用时最好用 . 来调用,避免产生错误。
local a = {}
function a.foo()
print("foo")
end
function a:func()
--self.foo() 如果这里加self的话,则下面使用a.func()时就会出错
print("func")
end
a:func() -- 没有self的情况下与a.func()相同
a:foo() -- 没有self的情况下与a.foo()相同
:定义的函数默认传入一个self
local MainScene = {}
function MainScene:ctor()
self:ceshi(1, 2, 3) --实际上传入的参数为self,1,2,3
end
function MainScene.ceshi(a, b, c) --接收时只接收了self,1,2
print(a, b, c)
end
MainScene:ctor()
--输出 table:00A391B0 1 2
--第一个输出的实际为self,这里也就是MainScene表的地址了
:定义的函数默认接收一个self
local MainScene = {}
function MainScene:ctor()
self.ceshi(1, 2, 3)
end
function MainScene:ceshi(a, b, c)
--接收时默认接收一个self,所以掉用时的第一参数1被接收赋值给self
--其余俩个参数分别赋值给a,b 而c没有被赋值则为nil
print(self) --1
print(a, b, c) --2 3 nil
end
MainScene:ctor()
通常情况下,我们用 . 来访问表中的属性,用 : 来访问表中的函数(带self的)
下列程序中,foo函数用到了self,所以在定义时用:来定义,同时调用foo函数时也应该用:来调用,a.on=a.foo可以理解为将foo域的方法给到了on域中,所以在调用on域的方法时,不能使用.来调用,而应该使用:来调用
local a = {name = "gcq"}
function a:foo()
print(self.name)
end
a.on = a.foo
--a.on() --编译出错
a:on() --gcq