先看一下类的写法
Test = {}
Test.__index = Test
function Test:new(x,y)
local temp = {}
setmetatable(temp, Test)
temp.x = x
temp.y = y
return temp
end
function Test:fun1() -- 这里用冒号
print('fun1 : ',self.x,self.y)
end
function Test.fun2() -- 这里用点号,函数内访问了成员变量
-- 该函数无法调用,无法识别self
print('fun2 : ',self.x,self.y)
end
function Test.fun3(obj) -- 这里用点号,函数内访问了成员变量
print('fun3 : ',obj.x,obj.y)
end
object1 = Test:new(10,20)
print('object1:fun1()')
object1:fun1() -- 使用冒号调用函数
print('object1.fun1(object1)')
object1.fun1(object1) --使用点号调用函数,可以调用,但是需要显式传参数self -- line1
-- object1.fun2() -- 无法调用,无法识别self
print('object1.fun3(object1)')
object1.fun3(object1)
print('object2 = Test.new(10,20)')
object2 = Test.new(10,20) --可调用,但是第一个参数10会被认为是self,故最终打印出来,x值为20,而y没有赋值,为nil
object2:fun1() --输出结果为"20 nil"
object2.fun1(object2) --输出结果为"20 nil"
总结:
用在声明对象时,冒号默认接收第一个参数为self指针,然后才是显式声明的参数,点号没有自动添加参数,所以冒号适用于需要访问成员变量的函数,点号适用于不需要访问成员变量的函数
在调用函数时,冒号会在函数列表插入一个self的参数,点号不会,如果在声明函数是使用了冒号,而调用的时候想用点号,则需要自己手动添加第一个参数self,如line1