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中调用函数使用点号和冒号的区别的更多相关文章

  1. lua中调用C++函数

    lua中调用C++函数 我们产品中提供了很多lua-C API给用户在lua中调用,之前一直没用深究其实现原理,只是根据已有的代码在编码.显然这不是一个好的习惯,没用达到知其所以然的目的. 一.基本原 ...

  2. Lua中的函数

    [前言] Lua中的函数和C++中的函数的含义是一致的,Lua中的函数格式如下: function MyFunc(param) -- Do something end 在调用函数时,也需要将对应的参数 ...

  3. Lua中调用C++方法

    目前项目,使用了Lua脚本,至于使用Lua的好处不再赘述了.于是对Tolua做了一些小小的学习,总结一下吧. 主要说一下如何在Lua中调用C++方法. Lua调用C++的桥梁,是tolua.tolua ...

  4. 在 lua 中实现函数的重载

    在 lua 中实现函数的重载.注:好吧,lua中原来可以实现重载...local function create() local arg_table = {} local function dispa ...

  5. Lua中“.”调用方法与“:”调用方法的区别

    Lua中“.”调用方法与“:”调用方法的区别:                                                                             ...

  6. Python调用函数加括号和不加括号的区别

    Python调用函数加括号和不加括号的区别 # -*- coding: utf-8 -*- #!/usr/bin/env python # @Time : 2018/7/3 10:03 # @Desc ...

  7. Lua中调用C函数

    Lua利用一个虚拟的堆栈来给C传递值或从C获取值.每当Lua调用C函数,都会获得一个新的堆栈,该堆栈初始包含所有的调用C函数所需要的参数值(Lua传给C函数的调用实参),并且C函数执行完毕后,会把返回 ...

  8. Lua中调用C函数(lua-5.2.3)

    Lua能够调用C函数的能力将极大的提高Lua的可扩展性和可用性. 对于有些和操作系统相关的功能,或者是对效率要求较高的模块,我们全然能够通过C函数来实现,之后再通过Lua调用指定的C函数. 对于那些可 ...

  9. Lua中assert( )函数的使用

    当Lua遇到不期望的情况时就会抛出错误,比如:两个非数字进行相加:调用一个非函数的变量:访问表中不存在的值等.你也可以通过调用error函数显示的抛出错误,error的参数是要抛出的错误信息. ass ...

随机推荐

  1. 【Web安全】越权操作——横向越权与纵向越权

    参考:http://blog.csdn.net/github_39104978/article/details/78265433 看了上面的文章,对越权操作的概念还是比较模糊,不明确实际场景. 横向越 ...

  2. 【Unity Shader】七、透明的Transparent Shader

    学习资料: http://www.sikiedu.com/course/37/task/459/show# 本例的代码基于上一篇文章,添加透明效果.为了便于区分新增的部分,该部分使用和红色加粗字体. ...

  3. 【转载】TCP协议要点和难点全解

    说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面 2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的 3).针对对象:对TCP已经有了全面了解的 ...

  4. WPF中Name和x:Name

    x:Name用来在XAML中表示一个制定对象的名称:可以通过它来访问XAML对应的资源: Name在.net的很多类中都存在,在WPF中可以和x:Name互换. 结果: 1. 在XAML中只存在x:N ...

  5. <股市高手和你想的不一样>读书笔记

    书在这里 在股市中挖掘真正有成长潜力的好企业,是成功投资者的关键 股票被低估的时候,才值得买 我们买股票,就是买这家公司的未来 公司的成长性要重点看两个方面,一个方面要看该公司近三年的成长趋势,另外一 ...

  6. centOSmini安装教程

    最近使用了CentOS发现比Ubuntu更简洁,有些爱上CentOS了 1. 准备一版CentOS安装镜像文件 官网下载地址:http://www.centos.org/download/ 官方有三个 ...

  7. 关于使用QTcpSocket的一些总结

    QTcpSocket类的方法connectToHost会泄露内存,即使把调用这个方法的QTcpSocket实例delete掉,内存也不会释放!反复connectToHost会导致段错误,十分危险.必须 ...

  8. 自然语言交流系统 phxnet团队 创新实训 项目博客 (十二)

    关于情感词典的学习总结: 情感倾向可认为是主体对某一客体主观存在的内心喜恶,内在评价的一种倾向.它由两个方面来衡量:一个情感倾向方向,一个是情感倾向度. 情感倾向方向也称为情感极性.在微博中,可以理解 ...

  9. Relu的理解

    ReLU上的花样 CNN出现以来,感觉在各个地方,即便是非常小的地方都有点可以挖掘.比如ReLU. ReLU的有效性体现在两个方面: 克服梯度消失的问题 加快训练速度 而这两个方面是相辅相成的,因为克 ...

  10. PDFSharp生成PDF.

    在上面用OpenXML生成word后,原来利用Word2010里的导出成PDF功能就不能用. 然后找开源组件生成PDF,最开始用的是iTextSharp,做完导出报表了才发现,这个开源协议用的是AGP ...