先来看一段简单的代码:
local Animal = {}function Animal:Eat( food ) print("Animal:Eat", self, food)endfunction Animal.Sleep( time ) print("Animal.Sleep", self, time)endAnimal:Eat("grass")Animal.Eat("grass")Animal:Sleep(1)Animal.Sleep(1)
输出结果为:
Animal:Eat table: 0x7f8421c07540 grassAnimal:Eat grass nilAnimal.Sleep nil table: 0x7f8421c07540Animal.Sleep nil 1
由此可见,
定义:在Eat(冒号函数)内部有一个参数self,在Sleep(点函数)内部没有参数self;调用:用冒号(:)调用函数时,会默认传一个值(调用者自身)作为第一个参数;用点(.)调用函数时,则没有;-- 如果要使结果一致,则:
Animal:Eat("grass")Animal.Eat(Animal,"grass")Animal:Sleep()Animal.Sleep(Animal)
输出结果:
Animal:Eat table: 0x7f8421c07540 grassAnimal:Eat table: 0x7f8421c07540 grassAnimal.Sleep nil table: 0x7f8421c07540Animal.Sleep nil table: 0x7f8421c07540
-- 我们为什么可以用.和:来定义函数
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
可参考Lua函数定义:
3.4.10 – Function Definitions
The syntax for function definition is
functiondef ::= function funcbody funcbody ::= ‘(’ [parlist] ‘)’ block endThe following syntactic sugar simplifies function definitions:
stat ::= function funcname funcbody stat ::= local function Name funcbody funcname ::= Name {‘.’ Name} [‘:’ Name]The statement
function f () body endtranslates to
f = function () body endThe statement
function t.a.b.c.f () body endtranslates to
t.a.b.c.f = function () body endThe statement
local function f () body endtranslates to
local f; f = function () body endnot to
local f = function () body end