Lua中调用函数使用点号和冒号的区别

1.初学者最易混乱Top1——调用函数时用点号还是用冒号?

我们来看看下面的两句代码:

mSprite.setPosition(100, 20);
mSprite:setPosition(100, 20);

 

对于初次接触Lua的朋友来说,这简直就是噩梦,为嘛函数的调用有两种形式,是让我们随便挑的意思吗?
 
这两种形式是有区别的,区别很大,但只有一个。
不过,暂时不解释,后面再介绍。

2.最简单的类

我们先来看看简单的,来创建一个“类”试试,如下代码:

TSprite = {
        x = 0,
        y = 0,
    }
    function TSprite.setPosition(x, y)
        TSprite.x = x;
        TSprite.y = y;
    end
   
    TSprite.setPosition(1, 2);
    print("TSprite坐标(" .. TSprite.x .. "," .. TSprite.y .. ")");

 

其实就是创建了一个table,给这个table添加一些字段而已。
输出结果如下:

[LUA-print] TSprite坐标(1,2)


大家留意一下setPosition函数,函数里其实也是通过TSprite来调用x和y字段的。
并且,我们使用setPosition的方式是,使用点号,这是正宗的函数调用方式,记住了。

 

3.不用真实姓名可以吗?——self的作用

如果大家比较敏感的话,就会发现,刚刚的例子很有问题,如果我们这样调用的话:

 

   local who = TSprite;
    TSprite = nil;
   
    who.setPosition(1, 2);

 

这么做一定会报错,虽然通过who确实可以成功调用setPosition函数,但函数里需要用到TSprite,而此时的TSprite已经为nil了。
 
于是,聪明的我们可以这么做:

 

TSprite = {
        x = 0,
        y = 0,
    }
    function TSprite.setPosition(self, x, y)
        self.x = x;
        self.y = y;
    end
   
    local who = TSprite;
    TSprite = nil;
     
    who.setPosition(who, 1, 2);
    print("TSprite坐标(" .. who.x .. "," .. who.y .. ")");

 

输出结果仍然是:

[LUA-print] TSprite坐标(1,2)


留意setPosition的第一个参数,我们强制要求传入一个参数,这个参数就是TSprite本身。

 

于是,在调用setPosition函数时,传入who,who的内容就是TSprite的内容,于是,setPosition就能正常执行了。

4.发挥偷懒的传统美德——默认的self参数,以及默认传递self参数

如果你让一个高(chao)智(ji)商(lan)猿人每次创建函数和调用函数都要这么去处理self,那他一定会说“你过来一下下,我保证不打死你”。

所以,Lua提供了一个新的使用方式,没错,那就是冒号。

看好了,我说的是,用冒号调用函数。
如下代码:

 
 
 TSprite = {
        x = 0,
        y = 0,
    }
    function TSprite:setPosition(x, y)
        self.x = x;
        self.y = y;
    end
    local who = TSprite;
    TSprite = nil;
     
    who:setPosition(1, 2);

 

第一,留意setPosition函数的定义,使用了冒号;
第二,留意setPosition函数的调用,使用了冒号。

冒号的作用就是:定义函数时,给函数的添加隐藏的第一个参数self;调用函数时,默认把当前调用者作为第一个参数传递进去。

使用了冒号之后,就相当于我们刚刚使用点号时一样,只是我们不再需要显式地定义self参数以及主动地传递who参数。
 
好了,这就是点号和冒号的区别了,可以说,冒号是为了给我们偷懒而诞生的。
如果是使用Cocos2d-x lua来开发的话,大部分情况下都是使用冒号的。
原因很简单,因为大部分情况下我们都要使用到self参数,就像C++的this关键字一样。

转载于:https://www.cnblogs.com/AaronBlogs/p/7111265.html

理解Lua冒号区别及适用场合 Lua冒号的应用在函数的定义调用这两种场合可以互相替换,抛砖引玉,先给出Lua5.3参考手册对于冒号区别的解释,例子略有简化: 函数的定义:冒号语法可以用来定义方法, 就是说,函数可以有一个隐式的形参self。 因此,如下语句 function f(params) body end是这样一种写法的语法糖function f(self, params) body end ... 阅读详情

相关推荐

深度强化Q学习-基于微软AirSim仿真环境的自动驾驶案例(原理代码详解简易可行)

最近在学习《强化学习原理与Python实现》,肖智清著。参考第十二章的自动驾驶案例,写一篇总结,尽量做到简单可行,让有志于自动驾驶的小伙伴可以通过此篇博客可以管中窥豹,初步了解自动驾驶的强化学习训练过程。 本篇将自动驾驶问题转化为回合制的强化学习任务,设计以车辆观察图像运行状态为输入的自动驾驶算法,并在AirSim仿真环境中进行训练测试。本篇使用带经验回放目标网络的基于深度Q网络算法设计并实现智能体,对经验回放、目标网络深度Q学习算法进行简单介绍,并用代码实现。

shao918516的博客 8549

C 语言函数调用

1、有返回值,则用变量保存返回值:变量 = 函数名称(参数1, 参数2, …)变量的类型一定要返回值的类型一致2、无返回值或不管返回值:函数名称(参数1, 参数2, …)例:#include #include //使用 system(“pause”) 前得包含此头文件//匈牙利命名法void setPosition(float x, float y) {printf(“x = %f, y = %...

zhrq95的博客 608

telnet离线安装文件

telnet离线安装文件

python常用函数(库)

本文整理了python常用函数(库),包括字符串相关函数、常用函数、random库函数、time库函数、turtle库函数(海龟绘图)、numpy库函数

m0_60724695的博客 5235

Lua 基础:调用函数时用还是用冒号

本文转载于:http://www.benmutou.com/archives/1789 1.初学者最易混乱Top1——调用函数时用还是用冒号? 我们来看看下面的两句代码: mSprite.setPosition(100, 20); mSprite:setPosition(100, 20); 对于初次接触Lua的朋友来说,这简直就是噩梦,为嘛函数的调用有两种形式,是让我们...

weixin_30333885的博客 241

Android Audio代码分析19 - setPosition函数

之前我们看过get position,今天来看看set position。 *****************************************源码************************************************* //Test case 3: setPlaybackHeadPosition() on paused track @Larg...

jandroid 367

Ogre_初学指导_3_"场景节控制”

1、 位置设置 setPosition() & translate(). setPosition(x,y,z) translate(x,y,z)函数之间的不同setPosition()函数仅是设置,没什么可说。translate()以给定的值设置的位置,但是它是相对于现在的位置变换。如果一个场景结在位置(10,20,30)并我们调用setPosition(30,20,10),那个结

swazer_z 679

Lua 函数前的冒号,你知道他们的区别吗?

(.)冒号(:)的区别主要在于是否自动处理self参数。 没有使用冒号函数调用或定义,意味着它是一个独立的、不自动关联任何表的普通函数,这种函数的调用参数传递完全取决于你在调用时所提供的参数。

Coder567 1724

Lua(英文句)与冒号区别

Lua(英文句)与冒号区别用于定义调用函数的时候,不会传递self参数,不能够在函数内部使用self,否则报告错误。使用冒号定义调用函数的时候,会自动将调用者实例自身作为self参数进行传递,此时函数能够使用self参数。例function Foo.foo(arg) self.data = 10 -- 发生错误,self未定义 end调用:ins.foo(arg)

performance 1003

lua冒号区别

lua冒号区别: 一、定义方法的区别 1、冒号定义方法,默认会接受self参数;而定义的时候,默认不会接受self参数 例: (1)冒号定义 function class:test()   --这里会接受self参数,比如   print(self.a,self.b)   在这里self就是class对象本身,因此不会出错 end (2)定义 function...

爱拍凯特的专栏 3302

unity函数

unity transform Input.GetKey (KeyCode.x)//键盘按键,x是任意按键 transform.Rotate (x,y, z);//旋转,xyz表示坐标方向,Time.deltaTime对应单位时间 transform.Translate (x,y,x)//平移,xyz表示坐标方向,Time.deltaTime对应单位时间 后面加 Space.World表示按照世界坐标移动 if (Input.GetKey (KeyCode.A)) { transform.Rotate

weixin_43899645的博客 1002

matlab中set position,Matlab中set函数

set(get(gca,’title’),’FontSize’,10,’FontName’,’宋体’);%设置标题字体大小,字型set(get(gca,’XLabel’),’FontSize’,10,’FontName’,’Times New Roman’);%设置X坐标标题字体大小,字型set(get(gca,’YLabel’),’FontSize’,10,’FontName’,’Times N...

weixin_30588381的博客 9134

Lua——函数冒号区别

Lua——函数冒号区别 函数使用冒号表示该函数默认传递一个self参数,并且该参数指向调用者;使用则不会传递一个self参数,例如: local person = {} function person:talk(mes) print("talk",self,mes) end function person:sleep(time) print("sleep",self,time) end person:talk("aaa") person.sleep(5) 输出结果如下:

Fujige 853

HALCON关于显示的函数与介绍(持续更新)

halcon关于显示算子解读dev_update_off dev_update_on、dev_update_pc、dev_update_var、dev_update_window、dev_update_off 、dev_update_pc 、dev_update_var、dev_update_window、dev_close_window、dev_open_window、set_display_font、dev_set_draw、disp_message、disp_continue_message

CSDN博客 1万+

CCSprite setPosition(ccp(x,y)),锚

如果自己创建

wu_123_456的专栏 4905
上一篇: Lua点号和冒号区别
下一篇: lua面向对象编程之点号与冒号的差异详细比较
ddry47579
博客等级 码龄12年 10粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值