1、冒号定义方法,默认会接受self参数;而点号定义的时候,默认不会接受self参数
例:
(1)冒号定义
function class:test()
--这里会接受self参数,比如
print(self.a,self.b)
在这里self就是class对象本身,因此不会出错
end
(2)点号定义
function class.test()
--点号定义时,默认不会接受self参数,因此在这里用self会出错,找不到全局变量self,当然如果你把self定义成了一个全局变量的话。。。那么你赢了。。
print(self.a,self.b)--报错,找不到全局变量self
end
二、调用方法的区别
1、冒号调用方法,会默认地将对象本身(self)传递给方法;而点号调用则不会
例1:冒号定义
function class:test()
print(self.a,self.b)
end
(1)冒号调用:class:test(),这时候在test方法是可以使用self的,因为默认会将self传递给test方法
(2)点号调用:class.test(),这时候在test方法中使用self就会报错了,因为self并没有被传递给test方法,那么要怎么在test方法中使用self呢?其实也简单,把class对象传递过去就好了,如:class.test(class)
例2:点号定义
function class.test()
print(self.a,self.b)
end
(1)冒号调用:class:test(),这时会报错,这里虽然冒号调用会把self传递过去,但是点号定义方法不接受self啊,所以会报错。想要用就只能显式地接受参数了,方法重新定义一下:function class.test(self) print(self.a) end
这样,冒号调用的时候默认把对象本身传递给方法了,方法也接受了这个参数,这就对了,参数self的名字可以改变,function class.test(tt) print(tt.a,tt.b) end
(2)点号调用:class.test(),定义的时候没有接受参数,调用的时候又没有传递参数。。能成功才怪!
直接说正确方法吧:就是传什么参数就用什么参数呗。。反正没有默认参数
定义的时候,显式地接受参数
function class.test(tt)
print(tt.a,tt.b)
end
class.test(class)
请发表评论