【笨木头Lua专栏】基础补充02:函数的几个特别之处

笨木头  2014-08-14 21:45   Cocos2d-x Lua   阅读(4,507)   6条评论

没想到距离上一篇基础补充已经过了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
2
3
4
5
function mutou()

print("这绝对不是广告:www.benmutou.com");

end

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

1
mutou();

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

2.扫盲——函数的参数

刚刚的mutou函数,我们修改一下参数,如代码:

1
2
3
4
5
6
7
function mutou(name, age)

print(name);

print(age);

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
2
3
4
5
function mutou(name, age)

return name, age;

end

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

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

print(name);

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

[LUA-print] 木头

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

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

print(name .. ":" .. age);

输入结果如下:

[LUA-print] 木头:25

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

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

1
2
3
4
5
local name, age, hehe = mutou("木头", 25);

print(name .. ":" .. age);

print(hehe);

输入如下:

[LUA-print] 木头:25

[LUA-print] nil

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

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

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

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

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

1
2
3
4
5
6
7
local a, b, c = "first", mutou("木", 25);

print(a);

print(b);

print(c);

输出结果如下:

[LUA-print] first

[LUA-print] 木

[LUA-print] 25

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

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

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

1
2
3
4
5
6
7
local a, b, c =  mutou("木", 25), "first";

print(a);

print(b);

print(c);

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

[LUA-print] 木

[LUA-print] first

[LUA-print] nil

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

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

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

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

某些情况下,我们可能会对于一个函数感到厌烦,没错,为什么你总是返回多个值?!(小若:还不是你自己写的函数吗!)

如果想让某个函数强制只返回一个值,可以这么做:

1
2
3
4
5
local a, b = (mutou("木", 25));

print(a);

print(b);

输入结果如下:

[LUA-print] 木

[LUA-print] nil

我们只需要在函数调用时,把函数调用放在括号中就可以了。

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

最后,我们来看看比较实用的一种函数参数——名字参数。

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

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

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

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

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

我们修改一下mutou函数:

1
2
3
4
5
function mutou(args)

return args.name, args.age;

end

现在mutou函数的参数变成了一个table,它要求table中包含name和age两个值。

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

1
2
3
local args = {name = "木", age = 25};

print(mutou(args));

没错,传递一个table变量给mutou函数就可以了,由于函数在取参数值的时候,是根据table的key值来获取的,根本就不需要考虑参数顺序,这就解决了我们刚刚所说的顺序问题了。

8.结束

好了,关于函数的基础特性,就这么多了,当然,还有一个变长参数我没有提到,因为这好像没什么好提的~

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

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

近期是计划把《Lua程序设计》这本书过一遍,希望能坚持~

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

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

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

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

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

原文地址:http://www.benmutou.com/archives/1702

转载于:https://www.cnblogs.com/wodehao0808/p/8617063.html

(转载)【笨木头Lua专栏】基础补充02:函数的几个特别之处相关推荐

  1. (转载)【笨木头Lua专栏】基础补充01:巧说table的几种构造方式

    [笨木头Lua专栏]基础补充01:巧说table的几种构造方式 笨木头  2013-06-4 23:04   Cocos2d-x Lua   阅读(13,556)   13条评论 之前对于Lua的研究 ...

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

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

  3. 笨木头Lua专栏 函数的几个特别之处

    [笨木头Lua专栏]基础补充02: [木头Cocos2d-x 029]Lua篇(第04章):来点高难度的,获取Lua表结构数据 只是获取一个全局变量什么的太没意思了,今天我们来玩个高难度的--获取Lu ...

  4. 【笨木头Lua专栏】基础补充02:函数的几个特别之处

    没想到距离上一篇基础补充已经过了1年多了,最近准备捡回Lua,把基础都补补,今天来聊聊Lua的函数吧~ 0.环境 我突然对Lua又大感兴趣的最主要原因是,Cocos Code IDE开始浮出水面了,它 ...

  5. (转载)【笨木头Lua专栏】基础补充18:Lua的模块编写与module函数

    很快就要开始介绍Lua里的"面向对象"了,在此之前,我们先来了解一下Lua的模块. 笨木头花心贡献,哈?花心?不,是用心~ 转载请注明,原文地址:http://www.benmut ...

  6. (转载)【笨木头Lua专栏】基础补充07:协同程序初探

    哎,周五晚上我都还这么努力看书,真是好孩子.(小若:不想吐槽了) 其实我都准备玩游戏看电影去的了,但是这书就摆在桌子上,而且正对着我,就想着,扫两眼吧. 结果一扫就不对劲了,因为这内容有点绕,有点小混 ...

  7. 【笨木头Lua专栏】基础补充01:巧说table的几种构造方式

    之前对于Lua的研究都是纸上谈兵,没有真正的项目练手,现在公司的项目基本上都是用Lua开发,是时候补充一下我那蹩脚的Lua知识了. 基础数据类型.表达式.循环结构什么的我就不说了,这么简单的东西说了也 ...

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

    哎,周五晚上我都还这么努力看书,真是好孩子.(小若:不想吐槽了) 其实我都准备玩游戏看电影去的了,但是这书就摆在桌子上,而且正对着我,就想着,扫两眼吧. 结果一扫就不对劲了,因为这内容有点绕,有点小混 ...

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

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

最新文章

  1. python网络开发框架_greenev首页、文档和下载 - Python网络服务框架 - OSCHINA - 中文开源技术交流社区...
  2. 中国大学moocpython笔记_用Python玩转数据,中国大学MOOC(慕课)答案公众号搜题
  3. 线程,进程,协程详细解释
  4. pads layout 中 hatch和flood之区别
  5. [HAOI2016]食物链
  6. linux鼠标键盘被禁用了,debian squeeze下鼠标、键盘突然被系统禁用
  7. 一个好用的变换类TransformManager
  8. 官方文档——一篇文章弄懂Flutter中的布局
  9. 小甲鱼 c语言 17课
  10. 车机没有carlife可以自己下载吗_视频实测:苹果CarPlay和百度CarLife到底哪个更好用...
  11. 3D动态相册实现代码
  12. 基于MicroPython实现ESP32+SSD1306的小恐龙游戏
  13. linux,centos部署wekan项目管理平台
  14. java多态的多种表现形式
  15. 农产品电商如何做直播卖货?
  16. layui内置模块(element常用元素操作)
  17. emacs之使用gnus读取和发送新浪邮件
  18. 严重性代码说明项目文件行禁止显示状态错误LNK2019无法解析的外部符号 main,函数 “int __cdecl invoke_main(void)“ (? invoke_main@@YAHX
  19. mac osx下载安装java运行环境
  20. 【原创】基站定位小测

热门文章

  1. win10PC上安装deepin深度Linux系统简易教程
  2. Java中导出pdf文件,pdf工具类demo
  3. 2020开年最火css效果实现
  4. kvm 1.创建虚拟机
  5. Linux 文件解压缩及权限管理
  6. 华清远见上海中心22071班 9.7作业
  7. 8.0强行转换后变成了7_干货|从中式英语,到雅思听力8.0,外研社英语演讲省一,非英专的她做了这些...
  8. 乔春洋:挑战型品牌的进攻策略
  9. 财务管理都学什么计算机课程,财务管理都学什么课程
  10. Vue天地图之图层类型切换