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 ...
随机推荐
- 使用Android Studio进行NDK开发
Step1:创建native方法 很easy,仅仅须要给定义好的方法加上native关键词就可以 注意:由于该方法的详细实现是在c++中详细实现的.所以相似于接口方法不须要加{}. Step2:生成c ...
- ViewController之间的转场和数据传递
ViewController之间的转场和数据传递 可以正向传递值, 反向传递值. 注意反向传值的时候,方法的位置: https://github.com/urmyfaith/GRDBUsage/blo ...
- mysql单表体积和一个库设计多少张表为妥
这篇文章来自于看博客园一个园友的分享经历,原文:http://www.cnblogs.com/qqloving/p/3427138.html 他不清楚mysql一个库里面分多少张表合适,他一个库分了8 ...
- Java并发编程:并发容器之CopyOnWriteArrayList<转>
原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容 ...
- [数据结构]图的DFS和BFS的两种实现方式
深度优先搜索 深度优先搜索,我们以无向图为例. 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发, ...
- SSM Spring +SpringMVC+Mybatis 整合配置 及pom.xml
SSM Spring +SpringMVC+Mybatis 配置 及pom.xml SSM框架(spring+springMVC+Mybatis) pom.xml文件 maven下的ssm整合配置步骤
- Mybatis if标签判断大小
1.if标签语法 <select...> SQL语句1 <if test="条件表达式"> SQL语句2 </if> </select&g ...
- eclipse中设置字体为VC经典字体Fixedsys
- matlab std函数 用法及实例
MATLAB常常用到std函数来进行标准差计算,下面我就通过实例介绍一下 matlab std函数怎么用. 1. std函数是用来计算标准偏差的一个函数,由于其有不同的参数,我们就用下面的例子进行介绍 ...
- JQ 弹出层全屏
下载:http://sc.chinaz.com/jiaoben/150427225380.htm http://sc.chinaz.com/jiaoben/150427225380.htm