Lua点号和冒号区别

转载 2016年05月31日 11:16:18

→_→  冒号的作用就是:定义函数时,给函数的添加隐藏的第一个参数self;调用函数时,默认把当前调用者作为第一个参数传递进去。

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

大部分情况下我们都要使用到self参数,就像C++的this关键字一样。


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

[plain] view plaincopy
  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 plaincopy
  1. function a:fun()   
  2. print(self.x)  
  3. end  
  4.   
  5. a.fun(a)  

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



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

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

[plain] view plaincopy
  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

然后我做了如下测试,来弄清楚冒号的用法
  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 语言中的点、冒号与self

转载自:http://my.oschina.net/lonewolf/blog/173065 && 转载自:http://www.faceye.net/search/80097.html 在lua...
  • xluren
  • xluren
  • 2015年03月12日 14:38
  • 2716

LUA中的冒号、点和self

敬请期待。。。
  • weiyuefei
  • weiyuefei
  • 2014年07月28日 16:17
  • 3438

关于ulua里从lua调C#时点操作符(.)和冒号(:)操作符的区别

1.首先贴上C#代码 public static int AddChild( IntPtr l ) { Debug.Log( "栈大小 " + LuaDLL.lua_gett...
  • yuxikuo_1
  • yuxikuo_1
  • 2016年08月24日 17:34
  • 1171

Lua中调用函数使用点号和冒号的区别

Lua中调用函数使用点号和冒号的区别 作者:笨木头 字体:[增加 减小] 类型:转载 时间:2014-09-15 我要评论 这篇文章主要介绍了Lua中调用函数使用点号和冒号的区别,本文...
  • boshuzhang
  • boshuzhang
  • 2017年07月31日 11:49
  • 133

lua面向对象编程中冒号与点号的区别

看到一篇博客,详细解释了lua中冒号与点号的用法。文章详细讨论了几种情况,这里对原文作出补充 首先,先来一段在lua创建一个类与对象的代码 1 2 3 ...
  • operhero1990
  • operhero1990
  • 2015年07月17日 15:19
  • 435

lua 点号"."和冒号":"、"seif"使用及区别

网上帖子太多了,看了好多,真是剪不断,理还乱。。。。 先说明一下self是在使用冒号":"是才有的关键字,就是说点号"."不起作用。 先上代码: tab={ value="第一个值" } --现在我们...
  • fengya1
  • fengya1
  • 2016年04月22日 13:49
  • 301

lua面向对象编程之点号与冒号的差异详细比较

2011-07-28 02:02 by youxiachai, 9067 阅读, 9 评论, 收藏, 编辑 首先,先来一段在lua创建一个类与对象的代码 1 ...
  • yaokang522
  • yaokang522
  • 2014年09月07日 19:25
  • 848

lua面向对象编程之点号与冒号的差异详细比较

lua面向对象编程之点号与冒号的差异详细比较 2011-07-28 02:02 by youxiachai, 8123 阅读, 9 评论, 收藏, 编辑 首先,先来一段在lua创建一个类与...
  • lnking1992
  • lnking1992
  • 2014年07月25日 11:52
  • 398

lua面向对象编程之点号与冒号的差异详细比较

首先,先来一段在lua创建一个类与对象的代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18...
  • playStudy
  • playStudy
  • 2012年10月07日 22:39
  • 660

lua面向对象编程之点号与冒号的差异详细比较

作为一名lua新手,在使用腾讯xLua框架时,也是一边在学习着Lua,对于点和冒号的用法一直理解的不够透彻,找到了这篇文章,原文地址: http://www.cnblogs.com/youx...
  • w6316485
  • w6316485
  • 2017年07月04日 17:31
  • 89
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Lua点号和冒号区别
举报原因:
原因补充:

(最多只允许输入30个字)