加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

理解lua 语言中的点、冒号与self

发布时间:2020-12-14 22:02:05 所属栏目:大数据 来源:网络整理
导读:转载自:http://my.oschina.net/lonewolf/blog/173065 转载自:http://www.faceye.net/search/80097.html 一句话总结: object:test() 与object.test(object)等价,多一个点 少一个object/self 在lua开发中我们经常会混淆这两者之间的区别,下面通过一个示例

转载自: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
boy:goToMarket(100) -- 注意这里的boy:goToMarket(100) ->boy.goToMarket(self,244)">print(boy.money)

这里进行了冒号定义和冒号调用。


以上的打印结果都是100。

可以看出,冒号定义和冒号调用其实跟上面的效果一样,:把第一个隐藏参数省略了,而该参数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())

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读