"Lua程序设计"

Published on Aug. 22, 2023, 12:06 p.m.

Lua程序设计(第4版)
罗伯拖·鲁萨利姆斯奇
11个想法

◆ 前言

Lua语言除了是一门可扩展的语言外,还是一门胶水语言(glue language)。

LuaRocks是一个Lua语言模块的部署和管理系统,该系统在2015年管理了1000多个涵盖各个领域的模块。

◆ 1.2 一些词法规范

Lua语言中使用两个连续的连字符(–)表示单行注释的开始(从–之后直到此行结束都是注释),使用两个连续的连字符加两对连续左方括号表示长注释或多行注释的开始(直到两个连续的右括号为止,中间都是注释),例如:[插图][插图]在注释一段代码时,一个常见的技巧是将这些代码放入–[[和–]]之间,

在Lua语言中,连续语句之间的分隔符并不是必需的,如果有需要的话可以使用分号来进行分隔。在Lua语言中,表达式之间的换行也不起任何作用。

◆ 1.3 全局变量

在Lua语言中,全局变量(Global Variable)无须声明即可使用,使用未经初始化的全局变量也不会导致错误。当使用未经初始化的全局变量时,得到的结果是nil:

当把nil赋值给全局变量时,Lua会回收该全局变量(就像该全局变量从来没有出现过一样)

◆ 1.4 类型和值

另一种有用的表达式形如((a and b)or c)或(a and b or c)(由于and的运算符优先级高于or,所以这两种表达形式等价,后面会详细介绍),当b不为false时,它们还等价于C语言的三目运算符a?b:c。例如,我们可以使用表达式(x>y)and x or y选出数值x和y中较大的一个。当x>y时,and的第一个操作数为true,与第二个操作数(x)进行and运算后结果为x,最终与or运算后返回第一个操作数x。当x>y不成立时,and表达式的值为false,最终or运算后的结果是第二个操作数y。
not运算符永远返回Boolean类型的值:
[插图]

◆ 2 小插曲:八皇后问题

本章作为小插曲将讲解如何用Lua语言编写的简单但完整的程序来解决八皇后问题(eight-queen puzzle,其目标是把8个皇后合理地摆放在棋盘上,让每个皇后之间都不能相互攻击)。
本书中给出的代码并不只适用于Lua语言,只要稍加改动,就能将代码转化成其他几种语言。之所以要在本章安排这个小插曲,是为了在不深究细节的情况下,先直观地呈现Lua语言的特点(尤其是其大致语法结构)。我们会在后面的章节中学习所有缺失的细节。
要解决八皇后问题,首先必须认识到每一行中只能有一个皇后。因此,可以用一个由8个数字组成的简单数组(一个数字对应一行,代表皇后在这一行的哪一列)来表示可能的解决方案。例如,数组{3,7,2,1,8,6,5,4}表示皇后在棋盘中的位置分别是(1,3)

◆ 4.1 字符串常量

Lua语言中的字符串支持下列C语言风格的转义字符:[插图]

◆ 5.4 遍历表

对于列表而言,可以使用ipairs迭代器:[插图]此时,Lua会确保遍历是按照顺序进行的。

◆ 6.2 可变长参数函数

Lua语言中的函数可以是可变长参数函数(variadic),即可以支持数量可变的参数。例如,我们已经使用一个、两个或更多个参数调用过函数print。虽然函数print是在C语言中定义的,但也可以在Lua语言中定义可变长参数函数。下面是一个简单的示例,该函数返回所有参数的总和:[插图]参数列表中的三个点(…)表示该函数的参数是可变长的。当这个函数被调用时,Lua内部会把它的所有参数收集起来,我们把这些被收集起来的参数称为函数的额外参数(extra argument)。当函数要访问这些参数时仍需用到三个点,但不同的是此时这三个点是作为一个表达式来使用的。在上例中,表达式{…}的结果是一个由所有可变长参数组成的列表,该函数会遍历该列表来累加其中的元素。我们将三个点组成的表达式称为可变长参数表达式(vararg expression),其行为类似于一个具有多个返回值的函数,返回的是当前函数的所有可变长参数。例如,print(…)会打印出该函数的所有参数。又如,如下的代码创建了两个局部变量,其值为前两个可选的