local Animal = {}
function Animal:Eat( food )
print("Animal:Eat", self, food)
end
function Animal.Sleep( time )
print("Animal.Sleep", self, time)
end
Animal:Eat("grass")
Animal.Eat("grass")
Animal:Sleep(1)
Animal.Sleep(1)
在编辑器中可见,可以看到sleep函数的self下方是有波浪线的。
解析:
1、Animal:Eat("grass")的结果:
Animal:Eat table: 0x7f8421c07540 grass
说明调用时,将自身Animal 这个表作为self传递了进去。
2、Animal.Eat("grass")的结果:
Animal:Eat table: 0x7f8421c07540 grass
用不同调用方式调用了Animal的Eat("grass"),但是却得到一样的输出结果,说明在Eat(冒号函数)内部有一个参数self,因为Eat方法在定义的时候写了冒号,后面不管怎么调用,都会有一个默认参数内部self,而且这个self就是自己本身这个对象。
3、Animal:Sleep(1)的结果:
Animal.Sleep nil table: 0x7f8421c07540
4、Animal.Sleep(Animal)的结果:
Animal.Sleep nil table: 0x7f8421c07540
可以看到,不管用什么方式去调用Sleep方法,结果都是一样的,因为Sleep在定义的时候用的是点号,内部没有参数self。
-- 我们为什么可以用.和:来定义函数
function Animal.Sleep( time ) end
-- 这种写法是一种语法糖(syntactic sugar),它的原型是:
Animal.Sleep = function ( time ) end
用双冒号(:)时,也是一种语法糖,实际上默认传递一个self(Animal)参数:
function Animal:Eat( food ) end
等价于
function Animal.Eat( self, food ) end
网友评论