关闭

Lua点号和冒号区别

标签: Lua
352人阅读 评论(0) 收藏 举报
分类:

→_→  冒号的作用就是:定义函数时,给函数的添加隐藏的第一个参数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之间通信。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:211888次
    • 积分:2830
    • 等级:
    • 排名:第12712名
    • 原创:31篇
    • 转载:268篇
    • 译文:0篇
    • 评论:6条
    文章分类
    最新评论