Lua 入门学习笔记
本教程旨在帮助有编程基础的学习者快速入门Lua编程语言。包括Lua中变量的声明与使用,包括全局变量和局部变量的区别,以及nil类型的概念、数值型、字符串和函数的基本操作,包括16进制表示、科学计数法、字符串连接、函数声明与调用等。此外,还介绍了table类型及其数字下标和字符串下标的用法,包括数组型table的声明、赋值、长度获取以及元素操作等。最后,介绍了Lua中的全局表、真和假的定义、分支判断语句以及三种循环语句(for循环、while循环)
建议有编程基础的同学使用这篇文章
一、编译环境
在线体验LuatOS
先直接写一个输出
print("hello world")
- 是
print
不是printf
- 语句后面没有分号
二、变量声明与作用域
-
默认全局变量:Lua 中直接赋值的变量默认是全局变量,跨文件可见。
-
局部变量:使用
local
关键字声明,作用域限定在当前代码块、函数或文件内。 -
多变量赋值:
local a = 0 b, c = 1, 2 -- 同时声明 b=1, c=2 d, e, f = 1, 2 -- c 未被赋值,值为 nil
- 规则:
- 左侧变量数 > 右侧值时,多余变量赋
nil
; - 右侧值数 > 左侧变量时,多余值被忽略。
- 左侧变量数 > 右侧值时,多余变量赋
- 规则:
三、数据类型系统
nil 类型
-
表示未初始化或显式赋空值:没有初始化的都为nil
-
相当于C语言中的NULL类型
local a print(undeclared_var) -- 输出 nil
number 类型
在c语言里面数值有很多个类型,比如说int chair long float,但是在lua里面都统一叫做number数值型。
-
统一数值类型,支持多种表示方式:
- 十进制:
123
- 十六进制:
0x1F
(十进制 31) - 科学计数法:
2e10
(表示 20000000000)
- 十进制:
-
运算支持: lua也是支持加减乘除运算的,以及成幂符号,左移右移
print(10 ^ 5) -- 幂运算输出 100000 print(1 << 3) -- 左移运算输出 8 print(8 >> 1) -- 右移运算输出 4
string 类型
字符串的声明的话,跟c是差不多的。我们可以在lua里用双引号来圈住一些字,表示一个字符串也可以用单引号圈出一个字,表示字符串单引号和双引号都是可以的,而且支持转义字符。
-
声明方式:
-
单引号/双引号:支持转义符(如
\n
) -
长字符串:
[[多行文本]]
(保留原始格式,不转义)a = "agcuiogogqWCU" b = 'uigdcfuwioge' c = [[dghoeuivfqwe qiowhc 1266]]
-
-
操作:
另外在lua里面字符串的连接符号不是加号,是两个点
c = a..b -- 连接运算符是两个点 print(#"0123456789") -- 井号获取长度,输出 10
-
类型转换:
s = tostring(10) -- 转字符串 "10" n = tonumber("10") -- 转数值 10 tonumber("abc") -- 转换失败返回 nil
-
显示字符串长度:
a = "agcuiogogqWCU" print(#a) --在打印的前面加上'#'就可以显示这个字符串的长度
四、函数定义与使用
函数声明
-
一般的声明方式:
function function_name(...) ...-- body end
-
两种等效方式:
function f(a, b) print(a, b) end f = function(a, b) print(a, b) end
参数与返回值
-
参数处理:
- 参数不足时自动补
nil
,多余参数被忽略。
- 参数不足时自动补
-
多返回值: 我们可以在函数里主动返回一些值,并且可以返回多个值
function f() return 1, 2 end i, j = f() -- i=1, j=2
-
默认返回值:无
return
时返回nil
。
五、表(table)数据结构
数组型 table
-
语法:
-
用大括号将成员括起来 ‘{ }’
-
用赋值 ‘=’ 赋值给变量
-
用逗号将成员分开 ‘,’
arr = {1,2,3,4,5}
-
-
核心特性:
- 下标从 1 开始,支持混合类型元素(也就是说可以存数字、字符串、函数、其他的table,但要注意用 ‘,’ 隔开)。
- 未定义元素值为
nil
。 - 动态扩展——对于table中没有定义的位置可以直接赋值
- 自带的接口
- insert(【table】,【位置】,【值】)
- remove(【table】,【位置】) ——有返回值,返回被移除的元素
-
操作示例:
arr = {1, "two", {subtable = true}} print(arr[5]) -- 输出 nil arr[5] = "new" -- 动态扩展 print(#arr) -- 获取长度 5 table.insert(arr, 2, "d") -- 插入元素 removed = table.remove(arr, 2) -- 移除元素并返回 "d"
哈希表型 table
-
字符串下标:
tbl = { key1 = 1, c = function() --..... end, ["特殊符号"] = 123 --注意中括号以及"" } tbl["abc"] = "abc" print(tbl.key1) -- 输出 1(这种输出方式需要字符串下标符合变量命名规范) print(tbl["特殊符号"]) -- 输出 123(注意是字符串,带有"")
-
未声明键值返回
nil
,支持动态添加键值对。
全局表 _G
-
存储所有全局变量:
a = 1 print(_G["a"]) print(_G.a) -- 输出 1 print(_G.table.insert) -- 输出函数地址
-
实际上table也是一个全局变量,table这个全局变量它的类型就是table,它有一个下标叫做insert,同时table, 它因为是全局变量,所以它也在下划线g全局表里面,就像这样,我们打印出来发现它是一个table,而且呢,因为他也是一个table.
print(_G["table"]["insert"])
六、控制结构
逻辑运算
-
真假规则:仅
false
和nil
为假,其他值(包括 0)为真。a = true b = false print(1 > 2) print(1 < 2) print(1 <= 2) print(1 >= 2) print(1 == 2) print(1 ~= 2)
注意:在lua中不等于是用 " ~=" 表示的,不是用 “!=” 表示的
短路求值:
print(nil or 0) -- 输出 0(返回第一个真值) print(true and "yes") -- 输出 "yes"(返回第二个操作数)
-
and(与) or(或) 和 not(非)
a = true b = false print(a and b) print(a or b) print(not a)
注意:
-
在lua里有个特殊的规定,在lua里面只有false和nil代表假,其他都是真c语言里面零也代表假,但是在lua里面数字0是代表真的,因为他不是nil或者false
-
Lua里面的end or和not返回的并不是完全是false和true, lua里会直接返回a或者b的值
-
我们可以用and和or来实现短路求值
a = nil b = 0 print(a and b) print(a or b) print(not a)
运行结果:
-
分支判断
-
语法:
if 【condition】 then -- code elseif 【condition2】 then -- code else -- code end
-
注意:
- elseif中间没有空格
- 条件后面有
then
- 就像上面提到的0也是代表真
循环结构
-
for 循环:
for i = 1, 10 do -- 倒序循环 if i == 5 then break end end
注意:
-
循环定义了一个变量,然后给变量一个初值,再给变量定义一个结束值,下面是执行的代码块,这个变量是可以直接使用的。当然这个变量出了这个代码块之后,就没有意义了。
-
我们还可以再加一个参数,这个参数叫做步长,就是每一次循环初值
i
的变化的值 -
循环里面
i
在运行图中是不能手动更改的。如果你修改了,他会默认悄悄给你在这边新建一个变量,它新建了一个临时变量,叫做i
,你后面调用的时候会用到i
,这一点和c不太一样,它的循环是不能更改的。for i = 10, 1, -1 do -- 倒序循环 if i == 5 then break end end
for i=10,i,-1 do print(i) local i=1 -- 新建一个临时变量 --.... end
-
-
while 循环:
n = 10 while n > 1 do n = n - 1 -- 必须显式修改循环变量 if n == 5 then break end end
注意:lua不支持自减操作如
n--
、n -= 1
这些
七、字符串高级特性
-
二进制安全:支持存储空字符(
0x00
):s = string.char(0x30, 0x31, 0x32, 0x33, 0x00) print(#s) -- 输出 5(包含空字符)
-
索引从 1 开始:
second = string.sub(s, 2, 2) print(string.byte(second)) -- 输出 49(ASCII 码值)
八、类型转换与数值表示
操作 | 成功返回值 | 失败返回值 |
---|---|---|
tonumber("123") | 123 | nil |
tonumber("0x1F") | 31 | nil |
tostring(123) | “123” | - |
tostring(nil) | “nil” | - |
九、编程实践要点
- 变量作用域:优先使用
local
声明局部变量。 - 表操作:注意数组下标从 1 开始,
#
仅统计连续数字下标长度。 - 字符串处理:使用
..
连接,#
获取字节长度。 - 函数设计:支持多返回值,参数不足自动补
nil
。 - 全局变量管理:通过
_G
表访问,避免污染全局命名空间。
进一步学习建议:
- 参考 Lua 5.3 官方手册
- 搜索 “Lua 5.3 参考手册” 查看完整函数库(如数学库、协程等)。
后面我会整理进阶部分的笔记,之后会把笔记链接粘贴到这里。