本文转载并修改于:http://blog.csdn.net/qq_28290581/article/details/52462841

本人稍加修改。

Lua中类的函数定义方式有三种方法:

定义方式:
①tab.func=function ( 参数)
– body
end

②function tab.func( 参数)
– body
end

③function tab:func( 参数)
– body
end

其中,①②两种定义方式与普通函数的定义一样。
方式③采用‘:’来定义,实际上隐藏了一个形参的声明,这个形参会截获调用函数时的第一个实参并把它赋值给self

Lua中类的函数使用方式有两种方法:
①tab.func(参数)
②tab:func(参数)

其中,①调用方式与普通函数的调用一样。
方式②采用‘:’来调用函数,实际上隐式的把tab自己当作第一个实参传递即tab:func(参数)相当于tab.func(tab,参数)

下面我们来看代码演示:

tab={}
function tab.func( a,b )  print(a,b)
end
tab.func("第一个参数","第二个参数")

大家可以自己演示一下,上面的输出就是“第一个参数”,“第二个参数”。

接着将最后一句的调用,换为

tab:func("第一个参数","第二个参数")

此时的输出结果就是:
table: 008AB9C8 第一个参数

这是因为,我们改为使用’:'的方式调用函数时,隐式的把tab本身作为第一个实参传递给了函数,即**a=tab,b=“第一个参数”,参数(“第二个参数”)**则被抛弃了。

接着我们再换个定义的方式:

tab={}
function tab:func( a,b )  print(a,b)
end
tab:func("第一个参数","第二个参数")

可以看到,我们这里定义类的函数方式,是使用 : 定义的
输出结果为"第一个参数 第二个参数"。

现在我们改变调用的方式,即将上面最后一行的调用改为如下:

tab.func("a","b")

输出结果变为:“第二个参数 nil”。

这是因为,我们用**“:”方式定义函数**,则隐式地多出一个形参,假设这个形参的名字为hide。则定义函数时tab:func(a,b)就相当于tab.func(hide,a,b)

那么当我们使用**"."来调用函数时,我们只传入了两个参数,其中参数"第一个参数"传递给了hide,参数"第二个参数"传递给了a,最后,nil作为参数传递给了b。**

在没改变函数调用方式之前,我们采用**‘:’的方式定义和调用函数**。调用时传递自身参数给了定义时隐式定义的形参。 即调用时为:tab:func(tab,“第一个参数”,“第二个参数”)

总结

使用":"定义类的函数时:
隐藏了一个形参的声明,这个形参会截获调用函数时的第一个实参并把它赋值给self

使用‘:’来调用函数:
实际上隐式的把自己当作第一个实参传递即tab:func(参数)相当于tab.func(tab,参数)

Lua函数的调用(:和.的调用区别)相关推荐

  1. Lua 函数、闭包、尾调用总结

    <lua 程序设计>在线阅读:http://book.luaer.cn/ 1.函数 函数有两种用途: 完成指定的任务,这种情况下函数作为调用语句使用: 计算并返回值,这种情况下函数作为赋值 ...

  2. oracle创建函数和调用存储过程和调用函数的例子(区别)

    创建函数: 格式:create or replace function func(参数 参数类型) Return number Is Begin --------业务逻辑--------- End; ...

  3. oracle创建包 和调用,oracle创建函数和调用存储过程和调用函数的例子(区别)...

    创建函数: 格式:create or replace function func(参数 参数类型) Return number Is Begin --------业务逻辑--------- End; ...

  4. Lua封装C++实践(二)—— C++调用Lua函数的封装

    在上篇博客中,记录了Lua与C/C++的基本交互,但是如果按照那样来使用的话,实在太麻烦了,所以我们开始进行封装.本篇博客主要记录C++调用Lua函数的封装. 封装目标 C++调用Lua,复杂的地方主 ...

  5. 直观讲解一下 RPC 调用和 HTTP 调用的区别!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:浮生忆梦 blog.csdn.net/m0_3811 ...

  6. 直观讲解一下RPC调用和HTTP调用的区别

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:浮生忆梦 blog.csdn.net/m0_38110132 ...

  7. 把接口调用打成jar包的类怎么写_直观讲解RPC调用和HTTP调用的区别

    来源 :浮生忆梦 很长时间以来都没有怎么好好搞清楚RPC(即Remote Procedure Call,远程过程调用)和HTTP调用的区别,不都是写一个服务然后在客户端调用么?这里请允许我迷之一笑~N ...

  8. RPC调用和HTTP调用的区别你知道吗

    前言 很长时间以来都没有怎么好好搞清楚RPC(即Remote Procedure Call,远程过程调用)和HTTP调用的区别,不都是写一个服务然后在客户端调用么?这里请允许我迷之一笑~Naive! ...

  9. 调用http_【学习充电】直观讲解一下 RPC 调用和 HTTP 调用的区别!

    很长时间以来都没有怎么好好搞清楚RPC(即Remote Procedure Call,远程过程调用)和HTTP调用的区别,不都是写一个服务然后在客户端调用么?这里请允许我迷之一笑~Naive!本文简单 ...

  10. 慕课matlab学习 第三章-017 函数文件的定义和调用

    第三节 程序流程控制 06-用函数文件的定义与调用 % 第三节 程序流程控制 % 06-用函数文件的定义与调用% 函数文件的基本结构 % function输出形参表=函数名(输入形参表) % 注释说明 ...

最新文章

  1. js数组的排序 sort详解
  2. MFC CMap整理
  3. 计算机系统概论寻址空间,自考《计算机系统结构》重点知识概论:数据表示(二)...
  4. sql查询每个学生的最高成绩mysql语句
  5. go如何使web工作
  6. 不清楚 spring 的这几个知识点,面试直接挂了!
  7. 项目手册 1.0 发布
  8. 交叉熵反向求导计算过程
  9. arcgis engine设置数据源路径_不懂ArcGIS,你前期分析用什么做的?
  10. talib python文档_TALib中文文档代码实现
  11. 冰河木马简易使用 ——病毒木马 003
  12. 【USB】STM32模拟USB鼠标
  13. OpenCV-单峰三角阈值法Thresh_Unimodal
  14. 《东周列国志》第八十四回 智伯决水灌晋阳 豫让击衣报襄子
  15. java定义个字符串_Java定义字符串(2种方式)
  16. 这个被上帝抛弃的国家,创立了全球一半的科技公司
  17. 斐讯n1 linux连接wifi,斐讯 N1 部署 Docker 和 OpenWRT,并利用 Hostapd 开启 Wi-Fi 热点
  18. 备选统驭科目(Alternative Reconciliation Accounts)配置及实操演示
  19. 用友投资一亿现金成立医疗软件公司
  20. 与谷歌AI领军科学家一较高下的梦想如何反应了中国对科技突破的追求?

热门文章

  1. Omnibox之Chrome关闭地址栏 输入提示
  2. 专题·树链剖分【including 洛谷·【模板】树链剖分
  3. SAP之Http Rest接口发布
  4. 二手手机交易存个人信息安全隐患?旧手机到底该怎么样处理?
  5. java map 自动排序_java Map排序问题
  6. python 使用opencv 切割图片的白边(横切和竖切)
  7. 浅谈高并发-前端优化
  8. 【DSP学习笔记】win10环境下安装CCS5.5
  9. 慧灵Z-EFG-F电爪详细参数及线序说明
  10. 硬件工程师基础知识1