Lua-面向对象中函数使用时冒号(:)和点(.)的区别
先来看一段简单的代码:
local Animal = {}
function Animal:Eat( food )
print("Animal:Eat", self, food)
end
function Animal.Sleep( time )
print("Animal.Sleep", self, time)
end
Animal:Eat("grass")
Animal.Eat("grass")
Animal:Sleep()
Animal.Sleep()
输出结果为:
Animal:Eat table: 0x7f8421c07540 grass
Animal:Eat grass nil
Animal.Sleep nil table: 0x7f8421c07540
Animal.Sleep nil
由此可见,
定义:
在Eat(冒号函数)内部有一个参数self,在Sleep(点函数)内部没有参数self;
调用:
用冒号(:)调用函数时,会默认传一个值(调用者自身)作为第一个参数;
用点(.)调用函数时,则没有;
-- 如果要使结果一致,则:
Animal:Eat("grass")
Animal.Eat(Animal,"grass")
Animal:Sleep()
Animal.Sleep(Animal)
输出结果:
Animal:Eat table: 0x7f8421c07540 grass
Animal:Eat table: 0x7f8421c07540 grass
Animal.Sleep nil table: 0x7f8421c07540
Animal.Sleep nil table: 0x7f8421c07540
-- 我们为什么可以用.和:来定义函数
function Animal.Sleep( time ) end
-- 这种写法是一种语法糖(syntactic sugar),它的原型是:
Animal.Sleep = function ( time ) end
用双冒号(:)时,也是一种语法糖,实际上默认传递一个self(Animal)参数:
function Animal:Eat( food ) end
等价于
function Animal.Eat( self, food ) end
可参考Lua函数定义:
http://www.lua.org/manual/5.2/manual.html#pdf-next
3.4.10 – Function Definitions
The syntax for function definition is
functiondef ::= function funcbody
funcbody ::= ‘(’ [parlist] ‘)’ block endThe following syntactic sugar simplifies function definitions:
stat ::= function funcname funcbody
stat ::= local function Name funcbody
funcname ::= Name {‘.’ Name} [‘:’ Name]The statement
function f () body endtranslates to
f = function () body endThe statement
function t.a.b.c.f () body endtranslates to
t.a.b.c.f = function () body endThe statement
local function f () body endtranslates to
local f; f = function () body endnot to
local f = function () body end
Lua-面向对象中函数使用时冒号(:)和点(.)的区别的更多相关文章
- getContext在谷歌浏览器中,使用时要先加载canvas对象,否则会提示'getContext is null'
<body> <canvas id=" style="border:1px solid #c3c3c3;"> Your browser does ...
- time.h文件中包含的几个函数使用时须注意事项
time.h头文件中包含以下函数 char* asctime(const struct tm *tm); char* asctime_r(const struct tm *tm,char *buf); ...
- 三种语言(c++、as、lua)中函数的差异性
对于不同的语言, 尤其是静态语言和动态语言, 对于函数的定义(即如何看待一个函数)和处理截然不同.具体来说可以分为两类: 1.将函数视为第一类型值, 即函数和其他的对象一样, 都是语言中一个普通的对象 ...
- 理解lua 语言中的点、冒号与self
转载自: http://blog.csdn.net/wangbin_jxust/article/details/12170233 lua编程中,经常遇到函数的定义和调用,有时候用点号调用,有时候用冒号 ...
- free函数使用时的注意事项。
free函数是我们在写C语言程序时常用的函数,但是使用时需要注意,一不小心很肯能会引起吐核. 注意:free函数与malloc()函数配对使用,malloc函数释放申请的动态内存.对于free(p)这 ...
- LUA table中函数的调用
1 lua中函数作为表中元素时有三种定义方式 采用‘:’来定义,实际上隐藏了一个形参的声明,这个形参会截获调用函数时的第一个实参并把它赋值给self 2 调用方式,点号和冒号 functb:hello ...
- Netty4.0.24.Final 版本中 IdleStateHandler 使用时的局限性
使用Netty在客户端和服务端建立通讯通道,一般来说,一个连接可能很久没有访问,由于各种各样的网络问题导致连接已经失效,客户端再次发送请求时会产生连接异常. 基于这个原因,需要在客户端和服务端之间建立 ...
- Entity framework 中Where、First、Count等查询函数使用时要注意
在.Net开发中,Entity framework是微软ORM架构的最佳官方工具.我们可以使用Lambda表达式在Entity framework中DbSet<T>类上直接做查询(比如使用 ...
- js中函数调用时,对参数个数和类型没有要求
因为js是一种弱类型的编程语言,对数据类型的要求没有其他编程语言的要求严格,所以在定义函数的时候不需要像java一样对其传入参数的类型进行定,也对传入参数的个数没有要求. js函数的参数与大多数其他语 ...
随机推荐
- javaweb回顾第十一篇过滤器(附实现中文乱码问题)
1:过滤器概念 过滤器就是一种在请求目标资源的中间组件,比喻把污水转换成纯净水中间需要一个污水净化设备,那么这个设备就好比一个过滤器.那么我用图来表示过滤器(可以有多个过滤器)运行的过程 2:Filt ...
- hibernate(七) hibernate中查询方式详解
序言 之前对hibernate中的查询总是搞混淆,不明白里面具体有哪些东西.就是因为缺少总结.在看这篇文章之前,你应该知道的是数据库的一些查询操作,多表查询等,如果不明白,可以先去看一下 MySQL数 ...
- 【技巧】只利用 Visual Stdio 自带的工具这么找父类?
很多人说只能 F12 看见子类 其实vs里面有一个叫“对象浏览器” 通过这个就可以直接定位父类,不需要利用reflector之类的工具来找父类 具体如下:
- [OpenCV] Samples 09: image
根据需求,转化为不同的颜色格式,split后处理各自通道. plImage <==> Mat 格式转换 Mat --> plImage 简单写法: IplImage copy = m ...
- 【干货】如何通过OPC自定义接口来实现客户端数据的读取?
上篇博文分享了我的知识库,被好多人关注,受宠若惊.今天我把我在项目中封装的OPC自定义接口的程序分享一下.下面将会简单简单介绍下OPC DA客户端数据访问,以及搭配整个系统的运行环境. OPC(OLE ...
- No resource identifier found for attribute 'showAsAction' in package 'android'
运行一个项目时在一个menu.xml文件item属性android:showAsAction 报错 No resource identifier found for attribute 'showAs ...
- J2EE修炼之四书五经[转自2004年程序员]
J2EE修炼之四书五经 作者:彭晨阳 J2EE其实没有四书五经,因为J2EE一直如汹涌澎湃的大江,推陈出新,不断高速发展,这是一种带领我们走向未来的技术.当然,如何在这种气势如虹的潮流之中不至于迷失方 ...
- [New Portal]Windows Azure Virtual Machine (15) 在本地制作数据文件VHD并上传至Azure(2)
<Windows Azure Platform 系列文章目录> 在上一章内容里,我们已经将包含有OFFICE2013 ISO安装文件的VHD上传至Azure Blob Storage中了. ...
- Elasticsearch——multi termvectors的用法
前一篇已经翻译过termvectors的使用方法了,这对于学习如何使用tf-idf来说是很有帮助的了. 更多内容参考我整理的ELK教程 什么是TF-IDF? 今天早晨起来,看<ES IN ACT ...
- jquery Ajax异步请求之session
写了一个脚本,如下: $(function () { $("#btnVcode").click(function () { var receiveMobile = $(" ...