Lua中调用函数使用点号和冒号的区别
1.初学者最易混乱Top1——调用函数时用点号还是用冒号?
我们来看看下面的两句代码:
mSprite.setPosition(, );
mSprite:setPosition(, );
对于初次接触Lua的朋友来说,这简直就是噩梦,为嘛函数的调用有两种形式,是让我们随便挑的意思吗?
这两种形式是有区别的,区别很大,但只有一个。
不过,暂时不解释,后面再介绍。
2.最简单的类
我们先来看看简单的,来创建一个“类”试试,如下代码:
TSprite = {
x = ,
y = ,
}
function TSprite.setPosition(x, y)
TSprite.x = x;
TSprite.y = y;
end
TSprite.setPosition(, );
print("TSprite坐标(" .. TSprite.x .. "," .. TSprite.y .. ")");
其实就是创建了一个table,给这个table添加一些字段而已。
输出结果如下:
[LUA-print] TSprite坐标(,)
大家留意一下setPosition函数,函数里其实也是通过TSprite来调用x和y字段的。
并且,我们使用setPosition的方式是,使用点号,这是正宗的函数调用方式,记住了。
3.不用真实姓名可以吗?——self的作用
如果大家比较敏感的话,就会发现,刚刚的例子很有问题,如果我们这样调用的话:
local who = TSprite;
TSprite = nil; who.setPosition(, );
这么做一定会报错,虽然通过who确实可以成功调用setPosition函数,但函数里需要用到TSprite,而此时的TSprite已经为nil了。
于是,聪明的我们可以这么做:
TSprite = {
x = ,
y = ,
}
function TSprite.setPosition(self, x, y)
self.x = x;
self.y = y;
end
local who = TSprite;
TSprite = nil;
who.setPosition(who, , );
print("TSprite坐标(" .. who.x .. "," .. who.y .. ")");
输出结果仍然是:
[LUA-print] TSprite坐标(,)
留意setPosition的第一个参数,我们强制要求传入一个参数,这个参数就是TSprite本身。
于是,在调用setPosition函数时,传入who,who的内容就是TSprite的内容,于是,setPosition就能正常执行了。
4.发挥偷懒的传统美德——默认的self参数,以及默认传递self参数
如果你让一个高(chao)智(ji)商(lan)猿人每次创建函数和调用函数都要这么去处理self,那他一定会说“你过来一下下,我保证不打死你”。
所以,Lua提供了一个新的使用方式,没错,那就是冒号。
看好了,我说的是,用冒号调用函数。
如下代码:
TSprite = {
x = ,
y = ,
}
function TSprite:setPosition(x, y)
self.x = x;
self.y = y;
end
local who = TSprite;
TSprite = nil;
who:setPosition(, );
第一,留意setPosition函数的定义,使用了冒号;
第二,留意setPosition函数的调用,使用了冒号。
冒号的作用就是:定义函数时,给函数的添加隐藏的第一个参数self;调用函数时,默认把当前调用者作为第一个参数传递进去。
使用了冒号之后,就相当于我们刚刚使用点号时一样,只是我们不再需要显式地定义self参数以及主动地传递who参数。
好了,这就是点号和冒号的区别了,可以说,冒号是为了给我们偷懒而诞生的。
如果是使用Cocos2d-x lua来开发的话,大部分情况下都是使用冒号的。
原因很简单,因为大部分情况下我们都要使用到self参数,就像C++的this关键字一样。
Lua中调用函数使用点号和冒号的区别的更多相关文章
- lua中调用C++函数
lua中调用C++函数 我们产品中提供了很多lua-C API给用户在lua中调用,之前一直没用深究其实现原理,只是根据已有的代码在编码.显然这不是一个好的习惯,没用达到知其所以然的目的. 一.基本原 ...
- Lua中的函数
[前言] Lua中的函数和C++中的函数的含义是一致的,Lua中的函数格式如下: function MyFunc(param) -- Do something end 在调用函数时,也需要将对应的参数 ...
- Lua中调用C++方法
目前项目,使用了Lua脚本,至于使用Lua的好处不再赘述了.于是对Tolua做了一些小小的学习,总结一下吧. 主要说一下如何在Lua中调用C++方法. Lua调用C++的桥梁,是tolua.tolua ...
- 在 lua 中实现函数的重载
在 lua 中实现函数的重载.注:好吧,lua中原来可以实现重载...local function create() local arg_table = {} local function dispa ...
- Lua中“.”调用方法与“:”调用方法的区别
Lua中“.”调用方法与“:”调用方法的区别: ...
- Python调用函数加括号和不加括号的区别
Python调用函数加括号和不加括号的区别 # -*- coding: utf-8 -*- #!/usr/bin/env python # @Time : 2018/7/3 10:03 # @Desc ...
- Lua中调用C函数
Lua利用一个虚拟的堆栈来给C传递值或从C获取值.每当Lua调用C函数,都会获得一个新的堆栈,该堆栈初始包含所有的调用C函数所需要的参数值(Lua传给C函数的调用实参),并且C函数执行完毕后,会把返回 ...
- Lua中调用C函数(lua-5.2.3)
Lua能够调用C函数的能力将极大的提高Lua的可扩展性和可用性. 对于有些和操作系统相关的功能,或者是对效率要求较高的模块,我们全然能够通过C函数来实现,之后再通过Lua调用指定的C函数. 对于那些可 ...
- Lua中assert( )函数的使用
当Lua遇到不期望的情况时就会抛出错误,比如:两个非数字进行相加:调用一个非函数的变量:访问表中不存在的值等.你也可以通过调用error函数显示的抛出错误,error的参数是要抛出的错误信息. ass ...
随机推荐
- [转]Handsontable对单元格的操作
原文地址:http://blog.csdn.net/mafan121/article/details/46119905 1.自动填充单元格数据 fillHandle:true/false //当 ...
- 【转】亲测plsql Developer配置免安装oralce客户端步骤
原文地址:http://blog.csdn.net/bushy0401/article/details/11869461 再次用到Oracle了,机器上面也没有oracle客户端,还得去网上下载,直接 ...
- win7下memCache安装过程
1.下载memcache 的windows 稳定版,解压放某个盘下面,比如在H:/wamp/www/php api/memcache: 2.在终端(即cmd 命令界面)下,输入安装命令 :H:/wam ...
- sqlserver查看和解除表死锁
1,查看那个表死锁 select object_name(resource_associated_entity_id) as tableName, request_session_id as pid ...
- name是个特殊的变量名吗
这是为什么?求大神
- easyui使用介绍
http://www.jeasyui.com/index.php based on jQuery, Angular and Vue. don't need to write many javascri ...
- jQuery验证控件jquery.validate.js的使用介绍
官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation jQuery plugin: Validation 使用说明 转载 ...
- mysql深坑之--group_concat有长度限制!!!!默认1024
在mysql中,有个函数叫“group_concat”,平常使用可能发现不了问题,在处理大数据的时候,会发现内容被截取了,其实MYSQL内部对这个是有设置的,默认不设置的长度是1024,如果我们需要更 ...
- 高可用保证消息绝对顺序消费的BROKER设计方案
转自: http://www.infoq.com/cn/articles/high-availability-broker-design?utm_source=tuicool&utm_medi ...
- CentOS执行ping命令报错 name or service not know
在虚拟机上安装的CentOS,但是当执行ping命令的时候,提示name or service not known 解决方法如下: 1. 添加DNS服务器 vi /etc/resolv.conf 1 ...