lua中 . 和 : 的区别

打印 上一主题 下一主题

主题 2393|帖子 2393|积分 7179

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近项目中使用到了 lua,因为之前没怎么接触过,特此记录下自己在学习过程中疑惑的地方。
在使用lua 进行编码的过程中,我们经常会使用到.和:,但是对于刚开始接触lua的我来说,对这两者的使用还是感到时常感到疑惑,接下来我们一起看看几个例子,来感受两者的区别。如果发现文中错误的地方,请不吝赐教,谢谢!
1、基础介绍

接下来,我们看看下面的例子,来了解.和:的基础用法。
  1. Car = {Name="BYD", Price=12}
  2. print("Car 的地址 --->", Car)
  3. print(Car.Name) -- 访问属性
  4. -- print(Car:Name) 报错
  5. print(string.rep("*", 20))
  6. function Car:find1()
  7.         print(": 定义的函数并且使用 : 调用时 self 的地址--->", self)
  8. end
  9. function Car.find2()
  10.         print(". 定义的函数并且使用 . 调用时 self 的地址--->", self)
  11. end
  12. Car:find1()
  13. Car.find2()
  14. print(string.rep("*", 20))
  15. function Car:find3()
  16.         print(": 定义的函数并且使用 . 调用时 self 的地址--->", self)
  17. end
  18. function Car.find4()
  19.         print(". 定义的函数并且使用 : 调用时 self 的地址--->", self)
  20. end
  21. Car.find3()
  22. Car:find4()
复制代码
运行结果:
  1. Car 的地址 ---> table: 038F9CA0
  2. BYD
  3. ********************
  4. : 定义的函数并且使用 : 调用时 self 的地址--->   table: 038F9CA0
  5. . 定义的函数并且使用 . 调用时 self 的地址--->   nil
  6. ********************
  7. : 定义的函数并且使用 . 调用时 self 的地址--->   nil
  8. . 定义的函数并且使用 : 调用时 self 的地址--->   nil
复制代码
大家测试的时候,可以自己试一试。
从上面我们知道:

  • 使用点号.来访问 table 的属性,不能使用:来访问 table 的属性。
  • 使用.和:都可以用来访问 table 的函数。
  • 使用:定义的函数并且使用:调用时,定义的函数中默认有一个变量self。而不是使用:定义的函数并且使用:调用时,定义的函数中的是没有self变量的。
2、稍微深入的了解

通过上面的介绍,我们对 .和: 有一个简单的了解,接下我们再稍微深入的了解下。这里先说结论,然后再看例子。
.和: 的区别在于使用 :

  • 使用: 定义的函数时,函数隐含 self 参数,使用 :调用函数会自动传入 tableself 参数。而使用.定义的函数并没有这样。
  • Lua 中使用:可以实现面向对象方式的调用。:只是语法糖,它同时在方法的声明与实现中增加了一个名为 self 的隐藏参数,这个参数就是对象本身。
2.1 : 定义的函数的示例
  1. classA={}
  2. print("ClassA 地址 -->", classA)
  3. function classA:getob(name)
  4.     print("classA:getob 中self 的地址 -->", self)
  5.     ob={}
  6.     setmetatable(ob,self)
  7.     self.__index=self
  8.     self.name=name
  9.     return ob
  10. end
  11. function classA:getself()
  12.     return self
  13. end
  14. c1=classA:getob("A")
  15. print("c1 地址 -->", c1)
  16. c2=classA:getob("B")
  17. print("c2 地址 -->", c2)
  18. print(string.rep("*",30))
  19. print(c1:getself())
  20. print(c2:getself())
  21. print(string.rep("*",30))
  22. ----------------------继承------------------------
  23. classB=classA:getob()    ----非常重要,用于获取继承的self
  24. function classB:getob(name,address)
  25.     ob=classA:getob(name)
  26.     setmetatable(ob,self)
  27.     self.__index=self
  28.     self.address=address
  29.     return ob
  30. end
  31. c3=classB:getob("gray.yang","shenzhen")
  32. print("c3 地址 -->", c3)
  33. print(c3:getself())
复制代码
运行结果:
  1. ClassA 地址 --> table: 0392D128
  2. classA:getob 中self 的地址 -->  table: 0392D128
  3. c1 地址 -->     table: 0392D010
  4. classA:getob 中self 的地址 -->  table: 0392D128
  5. c2 地址 -->     table: 0392CE80
  6. ******************************
  7. table: 0392D010
  8. table: 0392CE80
  9. ******************************
  10. classA:getob 中self 的地址 -->  table: 0392D128
  11. classA:getob 中self 的地址 -->  table: 0392D128
  12. c3 地址 -->     table: 03933050
  13. table: 03933050
复制代码
2.2 . 定义的函数的示例
  1. classA={}
  2. print(classA)
  3. function classA.new(cls,...)     --定义类方法时使用"."号,不适用隐式传参
  4.         print(cls)
  5.     this={}
  6.     setmetatable(this,cls)
  7.     cls.__index=cls           --将元表的__index设为自身,访问表的属性不存在时会搜索元表
  8.     cls.init(this,...)        --初始化表,注意访问类的方法都是".",此时不会隐式传入参数
  9.     return this
  10. end
  11. function classA.init(self,name)
  12.         print("classA.init -->", self)
  13.     self.name=name
  14. end
  15. function classA.getname(self)
  16.         print("classA.getname -->", self)
  17.     return self.name
  18. end
  19. -- 注意这里的调用方式,是 : 。
  20. p=classA:new("gray.yang")
  21. print("p --->", p)
  22. print(p:getname())
  23. print(string.rep("*",50))
复制代码
运行结果:
  1. table: 0381B888
  2. table: 0381B888
  3. classA.init --> table: 0381B8D8
  4. p --->  table: 0381B8D8
  5. classA.getname -->      table: 0381B8D8
  6. gray.yang
  7. **************************************************
复制代码
熟悉其他面向语言的同学,看了上面的例子,应该对.和:有了了解,接下来自己平常多写写就明白了。
参考资料
Lua 面向对象

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立聪堂德州十三局店

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表