我是靠谱客的博主 贪玩小猫咪,最近开发中收集的这篇文章主要介绍Lua点号和冒号区别,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

定义的时候冒号默认接收self参数
调用的时候冒号默认传递调用者自己为参数
而句号要显示传递或接收self参数

-- 例如:句号定义,需要显示传递或接收

[plain]  view plain copy
  1. a = { x = 1 }  
  2. function a.fun(self)   
  3. print(self.x)  
  4. end  
  5.   
  6. a.fun(a)--输出1,将a自己做为参数传给fun函数的self  

这样调用要传递self,比较麻烦,所以lua给一个方便的方法
将函数定义改成冒号,就可以省略self参数
[plain]  view plain copy
  1. function a:fun()   
  2. print(self.x)  
  3. end  
  4.   
  5. a.fun(a)  

将调用改成冒号,就可省略传自己进去
[plain]  view plain copy
  1. function a:fun()   
  2. print(self.x)  
  3. end  
  4.   
  5. a:fun()  



最后说明一下,如果不用self,直接在函数里使用x是不行的

之前以为可以像c++类一样,成员函数可以直接使用类成员变量

[plain]  view plain copy
  1. function a:fun()   
  2. print(x)--将输出nil,找不到这个x  
  3. end  
----------------------------------------------------------------------------------------------------



  lua本身没有类功能,它的类功能是通过元表来实现的。类的函数调用通过obj:function方式。但类的成员赋值又是通过obj.var方式来实现的。翻阅lua 5.1手册,发现对于冒号只有这么一段解释。(lua 5.1手册)

冒号语法可以用来定义方法, 就是说,函数可以有一个隐式的形参 self。 因此,如下写法:
    function t.a.b.c:f (params) body end
是这样一种写法的语法糖:
    t.a.b.c.f = function (self, params) body end

然后我做了如下测试,来弄清楚冒号的用法
[cpp]  view plain copy
  1. function test()  
  2.     t.f()  
  3.     t:g()  
  4.     t:h()  
  5.     t.i()  
  6.     t:h()  
  7.     t.j(t)  
  8.     t:h()  
  9. end  
  10.   
  11. t = {}  
  12.   
  13. function t.f()      
  14.     print("tf");  
  15. end  
  16.   
  17. function t:g()  
  18.     self.x = 10  
  19. end  
  20.   
  21. function t:h()  
  22.     print(self.x)  
  23. end  
  24.   
  25. function t.i()      
  26.     t.x = 20  
  27. end  
  28.   
  29. function t.j(k)      
  30.     k.x = 30  
  31. end  

输出:
[LUA-print] tf
[LUA-print] 10
[LUA-print] 20
[LUA-print] 30

发现冒号会提供一个内置table供function之间通信。

最后

以上就是贪玩小猫咪为你收集整理的Lua点号和冒号区别的全部内容,希望文章能够帮你解决Lua点号和冒号区别所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部