1 注释
单行注释
–注释内容
多行注释
–[[
注释内容
]]–
2 标识符
lua中的标识符由字母、数字、下划线组成;数字不作为开头;区分大小写。
通常,以下划线开头,后跟大写字母的名字被保留用于内部全局变量。
lua中保留的关键字有:
and break do else
elseif end false for
function if in local
nil not or repeat
return then true until
while
3 lua中的值和类型
最常见的类型有:
数值类型、字符串类型、布尔类型(true, false)
此外还有Table类型;lua中的函数也可以赋值给一个变量,所以也有函数类型
4 lua中的Table
lua中的表相当于一个关联数组。可以理解为Table = 数组 + 映射,Table即有数组功能,也有映射功能。
1) 数组功能
常规的如C语言,数组里的元素都必须是同一类型的;但lua的数组中可以同时存在不同类型的值。
也可以直接在{}中写值:
lua数组的特点:
- 不需要预定义长度
- 数组的值没有类型限制
- 下标从1开始,不是0
2) 映射功能
Table可以实现键和值的映射关系;键可以是数值,也可以只字符串。
也可以写成:
注意,字符串键可以通过点号来引用,但数值的键不行。
5 lua中的函数
函数由function关键字开始定义,由end结束,return关键字来返回结果值(函数有可以没有返回值)。
注:lua程序没有主函数。一个lua文件可以被当做一整个函数,在一个lua文件最后通过一个return,即可表示该文件的运行返回值。
例:
function add(a, b)
return a + b
end
print(add(1, 2))
上面的add函数还有如下等价的写法:
add = function (a, b)
return a + b
end
foo = add
print(add(1, 2))
print(foo(1,2))
这种写法可以理解为,将这个函数赋值给了add,add还可以继续赋值给foo。
在函数调用的时候,通过被赋值的变量来传参即可。
函数还可以赋值给Table中的一个元素,如:
class = {}
class.foo = function (a, b)
return a + b
end
也或写为:
class = {}
function class.foo(a, b)
return a + b
end
lua函数多返回值的特性
常规如C语言要一个函数返回多个值是不可能的,但lua函数可以。
function foo(a, b)
return a + b, a - b
end
x, y = foo(1, 2)
print(x, y)
注意:
lua支持多变量的赋值;
对于两个变量的值交换,可写为:x, y = y, x
6 lua中的表达式
1) 数值运算
+, -, *, / 没有++和–运算符
有趣的是,当数值和字符串做运算时,会自动转化为数值
2) 逻辑运算
and or not
3) 字符串拼接
.. 运算符为两个点
如果用+号会报错,因为+在lua中只用作数值运算
7 lua中的变量
lua中的变量默认就是全局变量。即默认情况下,一个函数内的变量,其作用域是全局的,在函数外也能直接调用。
为了声明是局部变量的话,需要在变量前用local关键字修饰。
带local关键字修饰的变量,只有局部作用范围,但运算效率会高很多。建议尽可能的使用local。
8 lua中的流程控制
1) if
if 条件 then
执行语句
elseif 条件 then
执行语句
else
执行语句
end
例:
local a = 61
if a < 60 then
print("F")
elseif a > 80 then
print("A")
else
print("B")
end
if 0 then
print("true")
end
注意:
false和nil为假;true和非nil为真;0为真
2) while
local i = 0
while i < 10 do
print(i)
i = i + 1
end
3) for
a) for的基本循环
for i = 1, 10, 1 do
print(i)
end
循环过程中,i会包括1和10两个终端的值,表示按照步长1打印从1开始到10的数字。
lua中默认步长为1,所以也可以省略不写步长1:
for i = 1, 10 do
print(i)
end
如果希望从10到1的话,将步长值改为-1即可:
for i = 1, 10, -1 do
print(i)
end
b) for的泛型遍历
测试代码:
运行结果如下:
pairs和ipairs是两个函数,也叫迭代器
他们的区别是:
pairs会便利Table中的所有元素;pairs是以散列的方式进行遍历,输出的结果是没有顺序的
ipairs只便利Table中的下标从1开始的连续数组元素
4) repeat … until
例如:
local a = 5
repeat
print(a)
a = a - 1
until a==0
9 lua中的包
通过require函数来引用已有的lua文件。
假设有foo.lua文件内容如下:
class = {}
function class.foo(a, b)
return a + b
end
return class
这里就可以直接引用foo.lua的代码:
local a = require("foo")
print(a.foo(1,2))
require会去查找文件名为”foo”的文件(文件名不需要带后缀),然后加载文件并运行
与此类似功能的还有dofile函数,但dofile引用文件需要带文件名后缀.lua。
此外的一个重要区别是:
require不管被调用多少次,只对文件加载运行一次;
dofile被调用几次,就会加载运行几次
测试代码:
运行结果:
10 lua中的系统库
lua中有很多常用系统函数,灵活使用可以帮助我们提高开发效率。
1) table
例1:table.insert()用来给数组插入数据
a = {}
for i = 1, 10 do
table.insert(a, i)
end
for k,v in pairs(a) do
print(k,v)
end
运行结果:
例2:table.remove()用来删除数组中指定下标的元素
a = {}
for i = 1, 10 do
table.insert(a, i)
end
#删除下标为2的元素
table.remove(a, 2)
for k,v in pairs(a) do
print(k,v)
end
运行结果:
左边键值里虽然还有2,但是右边其对应的值已经没有2了,变成了3。
例3:对于表中映射的删除,直接赋值nil即可。
b = {}
b.x=1
b.y=2
for k,v in pairs(b) do
print(k,v)
end
print("删除隐射y")
b.y=nil
for k,v in pairs(b) do
print(k,v)
end
运行结果:
例4:计算数组或字符串长度用#井号操作符
求表中元素的个数:
求字符串长度:
例5:类型转换
1) tonumber()
2) tostring()
用type()函数查看变量类型
例6:string.format字符串格式化
str1 = string.format(“my name is %s, I’m %d”, “Tom”, 25)