理解lua 语言中的点、冒号与self
转载自: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) 可以看到: 总结:可以把点号(.)作为静态方法来看待,冒号(:)作为成员方法来看待。
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 boy:goToMarket(100) -- 注意这里的boy:goToMarket(100) ->boy.goToMarket(self,244)">print(boy.money) 这里进行了冒号定义和冒号调用。 可以看出,冒号定义和冒号调用其实跟上面的效果一样,:把第一个隐藏参数省略了,而该参数self指向调用者自身 man={money=200} function man.goToMarket(self,204); width:949.75px; direction:ltr; background-color:white">man:goToMarket(100) -- 注意这里man:goToMarket(100) ->man.goToMarket(self,244)">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:GetName()) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |