没想到距离上一篇基础补充已经过了1年多了,近期准备捡回Lua,把基础都补补,今天来聊聊Lua的函数吧~

0.环境

我突然对Lua又大感兴趣的最主要原因是,Cocos Code IDE開始浮出水面了,它是Cocos2d-x官方出的一款专门针对Cocos2d-x+Lua或JS的IDE。试着用了,尽管不能说非常完美。但,非常值得期待。

所以,本文使用的Lua编辑器就选它了,大家就任意吧~

笨木头花心贡献,哈?花心?不。是用心~

转载请注明,原文地址:http://www.benmutou.com/archives/1702

文章来源:笨木头与游戏开发

1.扫盲——Lua的函数

Lua要创建和调用函数都十分简单,如代码:

  1. function mutou()
  2. print("这绝对不是广告:www.benmutou.com");
  3. end

这就创建了一个函数了。调用函数也十分简单:

  1. mutou();

然后执行。就能看到输出了,print也是一个函数。唉,不多唠叨了。

2.扫盲——函数的參数

刚刚的mutou函数。我们改动一下參数,如代码:

  1. function mutou(name, age)
  2. print(name);
  3. print(age);
  4. end

我们给mutou加入两个參数。一个是name,代表名字,一个是age,代表年龄。

顺便一提,Lua是没有变量类型这一说法的,变量会依据赋予的值而展现出不一样的类型。

我们试试这样调用mutou函数:

  1. mutou("木头", 25);

然后执行,输出例如以下:

[LUA-print] 木头

[LUA-print] 25
非常正常。我喜欢~

3.海量的心——函数參数个数自适应

Lua的函数心胸比較宽广,对于我们传递进去的參数,全部都会忍受,但,它会依照它的规则进行筛选。

继续刚刚那个mutou函数。我们试试这样调用:

  1. mutou("木头");

少给了一个參数,但,这和C++或者Java等语言不一样,它不会造成编译错误。仍然能够正常执行。

输出例如以下:

[LUA-print] 木头

[LUA-print] nil

对于缺少的參数,它会自己主动用nil来取代。

再然后。既然能够少给參数,那自然也能够多给參数了,试试这样调用:

  1. mutou("木头", 25, "旁白", 45);

(小若:你才45岁。你全身细胞都是45岁!

输出例如以下:

[LUA-print] 木头

[LUA-print] 25

结果自然是,多出參数会被舍去。

至于这是好事还是坏事,就看是谁使用了~

4.多重返回值

没错,Lua似乎把我们想要的能偷懒的全部事情都给想到了,而且给实现了。

Lua的函数支持返回多个值,继续改动mutou函数。例如以下:

  1. function mutou(name, age)
  2. return name, age;
  3. end

把传进去的两个參数又给return回来了,试试这样调用:

  1. local name = mutou("木头", 25);
  2. print(name);

调用mutou函数,而且用一个变量保存返回值,输出结果为:

[LUA-print] 木头

由于我们仅仅用了一个变量来保存返回值,所以即使函数返回了两个值,我们也仅仅能获取到一个。要想获取到两个值。就十分简单了,例如以下:

  1. local name, age = mutou("木头", 25);
  2. print(name .. ":" .. age);

输入结果例如以下:

[LUA-print] 木头:25

又顺便一提。用符号“..”能够连接字符串,这里就不多说了~

返回值和參数一样,假设我们尝试用三个变量去获取函数返回值。也不会造成编译错误,例如以下:

  1. local name, age, hehe = mutou("木头", 25);
  2. print(name .. ":" .. age);
  3. print(hehe);

输入例如以下:

[LUA-print] 木头:25

[LUA-print] nil

对于多出的变量,会赋予nil值。尽管这不会造成编译错误。可是也可能会造成执行时错误。

比方。用“..”符号去连接nil值,就会报错。

5.多重返回值的特点1——必须是表达式的最后一个元素

对于有多个返回值的函数,不一定全部情况下都能返回多个值。

先来看这样一种特别的情况,仍然是刚刚的mutou函数。我们这样调用:

  1. local a, b, c = "first", mutou("木", 25);
  2. print(a);
  3. print(b);
  4. print(c);

输出结果例如以下:

[LUA-print] first

[LUA-print] 木

[LUA-print] 25

没错,Lua的赋值语句是支持逗号表达式的(也就是用多个值给多个变量赋值),排在前面的值自然就优先赋给变量。所以变量a的值就是”first”。

只是,这不是重点~(小若:那你还说个毛线啊!

重点是。我们把顺序调换一下,例如以下:

  1. local a, b, c =  mutou("木", 25), "first";
  2. print(a);
  3. print(b);
  4. print(c);

输出结果会出乎大家的意料:

[LUA-print] 木

[LUA-print] first

[LUA-print] nil

没错,mutou函数的返回值变成仅仅有一个了。这就是函数的特点之中的一个:假设函数的调用不是在表达式的最后一个元素,则,最多仅仅返回一个值。

什么?还不够清晰吗?那再来举个粒子(小若:粒子你个头啊!

我们这样调用函数…额,那个,我们继续下一条内容。(小若:举不出样例那你刚刚还激动个毛线啊!

6.多重返回值的特点2——强制返回一个值

某些情况下。我们可能会对于一个函数感到厌烦。没错,为什么你总是返回多个值?!

(小若:还不是你自己写的函数吗!)

假设想让某个函数强制仅仅返回一个值。能够这么做:

  1. local a, b = (mutou("木", 25));
  2. print(a);
  3. print(b);

输入结果例如以下:

[LUA-print] 木

[LUA-print] nil

我们仅仅须要在函数调用时,把函数调用放在括号里就能够了。

7.名字參数/具名实參/named arguments

最后,我们来看看比較有用的一种函数參数——名字參数。

事实上“名字參数”是我自己的叫法,《Lua程序设计》第二版中是称之为“具名实參”,但我看到英文单词以及使用方法之后。我还是比較倾向于称之为“名字參数”。

先来问大家一个问题,我们刚刚一直在讨论的mutou函数,有多少个參数,不要回去看。1秒钟内回答~(小若:2个。)

第二个问题,mutou函数的age和name參数哪个在前哪个在后?0.001秒内回答。(小若:回答你个头啊!

没错,我们有时候并不记得一个函数的參数顺序,倒底age是第一个參数呢,还是name是第二个參数?(小若:好像哪里不正确…)

于是。具名实參就派上用场了。

我们改动一下mutou函数:

  1. function mutou(args)
  2. return args.name, args.age;
  3. end

如今mutou函数的參数变成了一个table。它要求table中包括name和age两个值。

于是。我们调用mutou函数的方式就变成了这样:

  1. local args = {name = "木", age = 25};
  2. print(mutou(args));

没错,传递一个table变量给mutou函数就能够了,由于函数在取參数值的时候,是依据table的key值来获取的,根本就不须要考虑參数顺序,这就攻克了我们刚刚所说的顺序问题了。

8.结束

好了。关于函数的基础特性。就这么多了,当然。另一个变长參数我没有提到。由于这好像没什么好提的~

近期我在计划坚持一件事情。那就是:晚上不写游戏,哪怕遇到让人兴奋的Bug。

我想把晚上的时间都拿来充电,我的基本功实在是不够用了。有点摇摇欲坠的感觉。

近期是计划把《Lua

rs=1&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F1702&p=baidu&c=news&n=10&t=tpclicked3_hc&q=25013069_cpr&k=%B3%CC%D0%F2%C9%E8%BC%C6&k0=c%2B%2B&kdi0=8&k1=%B3%CC%D0%F2%C9%E8%BC%C6&kdi1=1&k2=java&kdi2=1&sid=9cf8348041931b3a&ch=0&tu=u1682305&jk=d8ce873b79f07d62&cf=29&fv=14&stid=9&urlid=0&luki=2&seller_id=1&di=128" target="_blank" mpid="0" style="border: 0px; margin: 0px; padding: 0px; color: rgb(0, 136, 221); text-decoration: none;">程序设计》这本书过一遍,希望能坚持~

计划是每晚花一小时看书。花一小时整理教程。

今天是第一天,非常累,写教程比写游戏累多了。

有句什么话来着,永远不要让自己处于舒适的范围里。好吧。坚持…

(小若:用个毛线的省略号啊!用感叹号啊!这样才代表你有决心…)

我说,小若,那为什么你最后也用了省略号…

【笨木头Lua专栏】基础补充02:函数的几个特别之处的更多相关文章

  1. 【笨木头Lua专栏】基础补充04:迭代器初探

    今天学习的内容还蛮有意思的,让我兴奋了一下~ 笨木头花心贡献,哈?花心?不,是用心~ 转载请注明,原文地址: http://www.benmutou.com/archives/1714 文章来源:笨木 ...

  2. 【笨木头Lua专栏】基础补充05:迭代器番外篇

    关于迭代器的内容, 另一点点,只是已经无关紧要了.应该算是一种扩展吧.就一起来开开眼界好了~ 笨木头花心贡献.哈?花心?不.是用心~ 转载请注明,原文地址: http://www.benmutou.c ...

  3. 【笨木头Lua专栏】基础补充07:协同程序初探

    哎.周五晚上我都还这么努力看书.真是好孩子.(小若:不想吐槽了) 事实上我都准备rs=1&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F17 ...

  4. 【笨木头Lua专栏】基础补充08:协同程序之resume-yield间的数据返回

    这次要介绍几个事实上非常easy,可是一定要小心的返回值规则. 笨木头花心贡献,哈?花心?不,是用心~ 转载请注明.原文地址: http://www.benmutou.com/archives/173 ...

  5. 【本·伍德Lua专栏】补充的基础09:使用table.concat将一个大的字符串

    近期2天都没有写新的文章了.主要是近期的内容没有特别有意思的. 之前的协同程序也临时没有感觉到特别适用的地方.今天在看数据结构的部分,也是没多大意思(不代表没用). 但是突然发现了一个有意思的地方,那 ...

  6. 【本·伍德Lua专栏】补充的基础06:简单的错误处理

    昨天遇到另外一位独立游戏开发人员,所以多聊了一会,然后-然后就没有看书了.(小若:借口!借口! ) 今天来聊聊错误处理吧.只是毕竟这仅仅是前面的章节.书上的内容似乎有点一笔带过的味道. 没关系,简单更 ...

  7. JavaScript基础精华02(函数声明,arguments对象,匿名函数,JS面向对象基础)

    函数声明 JavaScript中声明函数的方式:(无需声明返回值类型) function add(i1, i2) {             return i1 + i2;//如果不写return返回 ...

  8. Scala基础篇-02函数与代码块

    1.block 代码块也是表达式,其最终求得的值是最后一个表达式的值. {exp1;exp2} { exp1 exp2 } 2.function def funtionName(param:Param ...

  9. [笨木头FireFly 02]入门篇2_客户端发送请求,服务器处理请求

    原地址:http://www.9miao.com/question-15-53940.html 好,经过上一篇不权威的讲解,大家已经能轻易地让客户端和服务端连接起来了. 但是,仅仅是连接了,可它们俩不 ...

随机推荐

  1. 验证DG最大性能模式下使用ARCH/LGWR及STANDBY LOG的不同情况

    总结:  --两台单实例数据库做DG,数据库版本号10.2.0.1.0 1.主库配置为:arch async,备库无STANDBY LOG. 日志中会有:RFS[4]: No standby redo ...

  2. HD-ACM算法专攻系列(19)——Leftmost Digit

    问题描述: AC源码: 解题关键是,数据很大,不能强算,需要使用技巧,这里使用科学计算法,令N^N=a*10^n ,取对数后变为 N*log10(N)=log10(a)+n,令x = log10(a) ...

  3. ORM框架——Dapper的应用

    常见的ORM框架有EF,Dapper,NHibernate 参考:http://shuai7boy.iteye.com/blog/2357339 http://www.cnblogs.com/Sint ...

  4. windows中安装redis的phpredis扩展

    1. 下载php的redis扩展 打开网址 http://pecl.php.net/ (php的扩展库官网),搜索redis,进入地址:http://pecl.php.net/package/redi ...

  5. 一个基于Vue.js+Mongodb+Node.js的博客内容管理系统

    这个项目最初其实是fork别人的项目.当初想接触下mongodb数据库,找个例子学习下,后来改着改着就面目全非了.后台和数据库重构,前端增加了登录注册功能,仅保留了博客设置页面,但是也优化了. 一.功 ...

  6. IE8不支持响应式设计解决方法

    下载并引入 respond.js 即可 为了针对IE8应用这段脚本,需要针对IE8的条件注释 <!--[if lt IE 9]> --- <! [endif]--> 为了不让并 ...

  7. CorelDRAW结合Photoshop绘制女性服装效果图

    今天小编为大家分享CorelDRAW结合PS绘制女性服装效果图,教程真的很不错,很值得大家学习,有兴趣的朋友赶快行动起来吧! CDR下载:http://pan.baidu.com/s/1cD4buQ ...

  8. mongodb配置文件详解

    logpath=/app/mongo/mongolog/mongo.log dbpath=/app/mongo/mongodata verbose = true #vvvv = true #此项会产生 ...

  9. 基于better-scroll封装一个上拉加载下拉刷新组件

    1.起因 上拉加载和下拉刷新在移动端项目中是很常见的需求,遂自己便基于better-scroll封装了一个下拉刷新上拉加载组件. 2.过程 better-scroll是目前比较好用的开源滚动库,提供很 ...

  10. python基础知识部分练习大全

    python基础知识部分练习大全   1.执行 Python 脚本的两种方式 答:1.>>python ../pyhton.py 2. >>python.py   #必须在首行 ...