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参数 调用的时候冒号默认传递调用者自己为参数 而句号要显示传递或接收self参数 -- 例如:句号定义,需要显示传递或接收 [plain] vie...

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

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

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

在lua创建一个类与对象的代码:   第一段代码 Class = {} Class.__index = Class function Class:new(x,y) // 定义方法用 : l...

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

首先,先来一段在lua创建一个类与对象的代码 Class = {} Class.__index = Class function Class:new(x,y) local temp = ...

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

转自:http://luaer.diandian.com/post/2011-10-09/5673234 首先,先来一段在lua创建一个类与对象的代码  01    Class = {} ...

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

作为一名lua新手,在使用腾讯xLua框架时,也是一边在学习着Lua,对于点和冒号的用法一直理解的不够透彻,找到了这篇文章,原文地址: http://www.cnblogs.com/youx...

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

首先,先来一段在lua创建一个类与对象的代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18...

C++ 箭头-> 双冒号:: 点号.操作符区别

引用是C++中的概念,初学者容易把引用和指针混淆一起。  一下程序中,n是m的一个引用(reference),m是被引用物(referent)。  int m;  int &n = m;  n相当于m...

C++ 箭头-> 双冒号:: 点号.操作符区别

引用是C++中的概念,初学者容易把引用和指针混淆一起。 一下程序中,n是m的一个引用(reference),m是被引用物(referent)。 int m; int &n = m; n相当于m的别名(...

在阅读内核碰到结构体的点号和冒号"."and":"

C99(c语言标准)用点号。linux kernel 中的冒号是gcc的扩展。.a表示结构体Str的成员,用来初始化。当结构体里有很多成员的话,这样会方便和清晰很多 int main() { ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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