转载自:http://my.oschina.net/lonewolf/blog/173065
&&
转载自:http://www.faceye.net/search/80097.html
一句话总结:
object:test() 与object.test(object)等价,多一个点 少一个object/self
在lua开发中我们经常会混淆这两者之间的区别,下面通过一个示例来解释:
Class = {} Class.__index = Class function Class.new(x,y) local cls = {} setmetatable(cls, Class) cls.x = x cls.y = y return cls end function Class:test() -- 等价于 -- function Class.test(self) print(self.x,self.y) end object = Class.new(10,20) object:test() -- 等价于 object.test(object)
可以看到:
1、定义的时候:Class:test()与 Class.test(self)是等价的,点号(.)要达到冒号(:)的效果要加一个self参数到第一个参数;
2、调用的时候:object:test() 与object.test(object)等价,点号(.)要添加对象自身到第一个参数。
总结:可以把点号(.)作为静态方法来看待,冒号(:)作为成员方法来看待。
lua编程中,经常遇到函数的定义和调用,有时候用点号调用,有时候用冒号调用,这里简单的说明一下原理。
girl={money=200}
function girl.goToMarket(girl,someMoney)
girl.money= girl.money -someMoney
end
girl.goToMarket(girl,100)
print(girl.money)
可以看出,这里进行了方法的点号定义和点号调用。
boy={money=200}
function boy:goToMarket(someMoney)
self.money = self.money -someMoney
end
boy:goToMarket(100) -- 注意这里的boy:goToMarket(100) ->boy.goToMarket(self,100)
print(boy.money)
这里进行了冒号定义和冒号调用。
以上的打印结果都是100。
可以看出,冒号定义和冒号调用其实跟上面的效果一样,:把第一个隐藏参数省略了,而该参数self指向调用者自身
当然了,我们也可以点号定义冒号调用,或者冒号定义点号调用
如:
man={money=200}
function man.goToMarket(self,someMoney)
self.money = self.money -someMoney
end
man:goToMarket(100) -- 注意这里man:goToMarket(100) ->man.goToMarket(self,100)
print(man.money)
总结:冒号只是起了省略第一个参数self的作用,该self指向调用者本身,并没有其他特殊的地方。
一个非常赞的例子,直接上代码:
function CreateStudent(ID,Name)
local Obj={id=ID,name=Name};
function Obj:GetID()
return self.id;
end
function Obj.GetName(self)
return self.name;
end
function Obj:SetID(ID)
self.id=ID;
end
Obj.SetName=function(self,Name)
self.name=Name
end
return Obj;
end
s1=CreateStudent(1,"andy");
print("s1'id=",s1:GetID(),"s1'name=",s1.GetName(s1))
s1:SetID(2);
s1.SetName(s1,"lili");
print("s1'id=",s1:GetID(),"s1'name=",s1:GetName())