写在前面
Lua在游戏开发的热更新中应用广泛,大多数游戏开发岗位都会要求员工掌握Lua语法。本篇文章主要面向已有编程语言基础的人员,用于快速掌握Lua的基础。
Lua简介及基本语法
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能,常用于游戏开发中的热更新。
第一个Lua程序
--打印函数print()
print("hello world");
print("hello aa") --lua可以省略分号
-- 这是lua 的单行注释
--[[
多行注释 1
]]
--[[
多行注释 2
]]--
--[[
多行注释 3
--]]
1. 简单数据类型(nil、boolean、number、string)
Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。
Lua中的变量有8种基本数据类型,分别为nil、boolean、number、string、userdata、function、thread 和 table,前四种为简单数据类型。
我们可以使用 type 函数测试给定变量或者值的类型。
1.1 nil类型
nil 有点类似其他语言中的null,表示为空,没有任何有效值。未声明过的变量默认值为nil。
print(a) -- 未声明过的变量,输出结果为nil
1.2 number(数字)类型
Lua 默认只有一种 number 类型 – double(双精度)类型(默认类型可以修改 luaconf.h 里的定义),任何数值都会被看作是number类型。
以下几种数值都为number类型
print(type(1))
print(type(1.11))
print(type(2e+1))
输出结果均为number
1.3 string(字符串)类型
--字符串的声明 使用一组单引号或双引号包裹都可
a = "abcdefg"
b = 'ccceee'
print(type(a))
print(type(b))
输出结果均为string
1.3.1 获取字符串长度
英文字符与其他语言一样,占1个长度,但Lua中的中文字符占3个长度。
s = "aBcd"
print(#s) -- 输出结果为4
s = "aBcd中文"
print(#s) -- 输出结果为10
1.3.2 字符串多行打印
-- 转义字符
print("abc\nabc") -- 换行符 \n
-- 使用 [[]]包裹
s = [[字符
串
打印
]]
print(s)
1.3.3 字符串拼接
-- 使用 .. 进行字符串连接
print("abc" .. "efg") -- 输出 abcefg
-- 数字和字符串之间也可以使用 .. 连接,连接后的结果为string类型
s = "abc"
num = 123
print(s .. num) -- 输出 abc123
num1 = 123
num2 = 456
print(num1 .. num2) -- 输出123456,类型为string
1.3.4 字符串格式化
Lua拥有与其他语言类似的format方法,但不同的是,这个函数的格式很像C语言中的printf()。
print(string.format("我叫田所浩二,今年%d岁了,是一名%s", 24 ,"学生"))
--Lua中使用%加一个字母(转义符)的形式表示转义码,以此接受不同的参数并将其转化成不同结果
常用转义码
- %c - 接受一个数字, 并将其转化为ASCII码表中对应的字符
- %d, %i - 接受一个数字并将其转化为有符号的整数格式
- %u - 接受一个数字并将其转化为无符号整数格式
- %f - 接受一个数字并将其转化为浮点数格式
- %s - 接受一个字符串并按照给定的参数格式化该字符串
还可以进一步对格式化操作进行细化,在%号后面添加参数,参数将会以符号、占位符、对齐标识、宽度、小数位数/字串裁切 的顺序读入:
(1) 符号: 一个+号表示其后的数字转义符将让正数显示正号. 默认情况下只有负数显示符号.
(2) 占位符: 一个0, 在后面指定了字串宽度时占位用. 不填时的默认占位符是空格.
(3) 对齐标识: 在指定了字串宽度时, 默认为右对齐, 增加-号可以改为左对齐.
(4) 宽度数值.
(5) 小数位数/字串裁切: 在宽度数值后增加的小数部分n, 若后接f(浮点数转义符, 如%6.3f)则设定该浮点数的小数只保留n位, 若后接s(字符串转义符, 如%5.3s)则设定该字符串只显示前n位.
-- 日期格式化
print(string.format("日期格式化 %02d/%02d/%03d", 1, 10, 2022)) -- 输出结果为 日期格式化 01/10/2022
-- 十进制格式化
print(string.format("%.4f",1/3)) -- 输出结果为 0.3333
1.3.5 其他类型转字符串
Lua和其他语言差不多,一样拥有tostring()方法
a = true
print(type(tostring(a))) -- 输出为string
1.3.6 其他字符串常用公共方法
-- 定义一个字符串str作为效果演示
str = "AabbCc"
①字符串大小写转换
-- 小写转大写
print(string.upper(str)) -- 输出AABBCC
print(str) -- 大小写转换并不会影响到原字符串,输出AabbCc
-- 大写转小写
print(string.lower(str)) -- 输出aabbcc
②翻转字符串
print(string.reverse(str)) -- 输出cCbbaA
③字符串索引查找
print(string.find(str, "bC")) --find方法返回结果有两个值,输出4 5,代表字符串起始和结束位置
④截取字符串
print(string.sub(str, 3)) --输入1个索引参数时,从起始位置开始截取到结束,输出bbCc
print(string.sub(str, 3, 4)) --输入2个索引参数时,分别表示截取的起始位置与结束位置
⑤字符串重复
print(string.rep(str, 2)) -- 输出AabbCcAabbCc
⑥字符串替换
print(string.gsub(str, "bC", "**")) -- 输出Aab**c 1,返回结果的第二个值为替换次数
⑦字符、 ASCII码互相转换
print(string.byte("Lua", 1)) -- 第二个参数表示索引,输出'L'对应的ASCII码 76
print(string.char(76)) -- 输出'L'
1.4 boolean(布尔类型)
a = true
b = false
print(type(a)) -- 输出结果为boolean
2. 运算符
2.1 算数运算符
Lua中拥有与其他语言一样的+,-,*,/,%,//(加、减、乘、除、取余、整除)运算符,不同的是Lua中的幂运算符为^。
a = 3
b = 2
c = a + b
print(c) -- 5
c = a - b
print(c) -- 1
c = a * b
print(c) -- 6
c = a / b
print(c) -- 1.5
c = a % b
print(c) -- 1
c = a^2
print(c) -- 9
-- Lua5.3后的版本提供了 "//" 作为整除运算符
c = a // b
print(c) -- 1
--在lua中,纯数值字符串甚至可以与数字使用算数运算符,结果类型为number
d = "123"
c = d + a
print(c) -- 126
需要注意的是Lua中没有自增自减运算符(++、–),没有复合运算符(+=、-=、/=、*=、%=)
2.2 条件运算符
Lua中拥有与其他语言大部分一致的条件运算符(>、<、>=、<=、==),不同的是Lua中的不等号为"~="。
print(3 > 1) -- true
print(3 < 1) -- false
print(3 >= 1) -- true
print(3 <= 1) -- false
print(3 == 1) -- false
print(3 ~= 1) -- true
2.3 逻辑运算符
Lua中的逻辑与符号为"and",或为"or",非为"not"。
逻辑与:同为true时才为true;
逻辑或:有一个为true就为true;
逻辑非:取反。
print(true and false) -- false
print(true and true) -- true
print(true or false) -- true
print(false or false) -- false
print(not true) -- false
2.4 位运算符
Lua中不支持位运算符,需要自己实现,可以使用一些第三方库实现。
2.5 三目运算符
Lua中也不支持三目运算符(b ? x : y)。
3. 条件分支语句
Lua中没有switch语句,只有if条件语句作为条件分支语句。
3.1 if条件语句
Lua采用 if 条件 then …… end 的形式组成if条件单分支语句,双分支语句用else语句组成。
a = 9
if a > 5 then
print("123")
end
-- 输出123
if a < 5 then
print("123")
else
print("456")
end
-- 输出456
根据多个条件可以选择多个分支进行执行,多分支语句用 elseif 条件 then 组成。
a = 9
if a < 5 then
print("123")
elseif a == 10 then
print("456")
elseif a < 10 then
print("789")
end
-- 输出789
4. 循环语句
4.1 while语句
Lua中使用 while 条件 do …… end 形式的语句表示while循环。
num = 0
while num < 2 do
print(num)
num = num + 1
end
输出结果为
0
1
4.2 do while语句
Lua的do while循环与其他语言差别较大,采用的是 repeat …… until 结束条件 的形式。
num = 0
repeat
print(num)
num = num + 1
until num > 1 -- 满足条件跳出,为结束条件
输出结果为
0
1
4.3 for 语句
Lua中for循环语句使用for 变量名 = 起始值,结束值[,步数(默认为+1)] do …… end
for i = 0,2 do --逗号后的参数为,默认step为+1
print(i)
end
输出结果为
0
1
2
for i = 0,4,2 do --第二个逗号后的参数为step
print(i)
end
print()
for i = 2,0,-1 do
print(i)
end
输出结果为
0
2
4
2
1
0