Lua语法基础 #
一、程序结构 #
1.1 Lua 程序的基本组成 #
一个 Lua 程序由以下元素组成:
lua
-- 1. 注释
-- 这是单行注释
--[[
这是多行注释
]]
-- 2. 变量定义
local name = "Lua"
local version = 5.4
-- 3. 函数定义
function greet()
print("Hello!")
end
-- 4. 语句执行
greet()
print("程序结束")
1.2 语句分隔 #
Lua 不强制要求语句分隔符,但可以使用分号:
lua
-- 无分号(推荐)
local a = 1
local b = 2
-- 有分号(可选)
local a = 1;
local b = 2;
-- 同一行多条语句(不推荐)
local a = 1; local b = 2
1.3 代码块 #
Lua 使用 do...end 创建代码块:
lua
do
local x = 10
print(x) -- 10
end
-- print(x) -- 错误:x 不可见
二、注释 #
2.1 单行注释 #
lua
-- 这是单行注释
print("Hello") -- 这是行尾注释
-- 注释可以放在任何位置
local x = 10 -- 定义变量 x
2.2 多行注释 #
lua
--[[
这是多行注释
可以跨越多行
用于详细说明
]]
--[[
函数名:calculate
功能:计算两个数的和
参数:a, b - 要相加的数
返回:两数之和
]]
function calculate(a, b)
return a + b
end
2.3 嵌套注释 #
Lua 5.4 支持嵌套多行注释:
lua
--[[
外层注释开始
--[[
内层注释
]]
外层注释结束
]]
2.4 注释技巧 #
lua
-- 快速切换代码块
--[[
print("被注释的代码")
--]]
-- 添加一个 - 启用代码
---[[
print("启用的代码")
--]]
-- 使用 --[[ ]] 包含代码块
--[[
local old_code = true
print("这段代码暂时禁用")
--]]
三、标识符 #
3.1 命名规则 #
标识符用于命名变量、函数、表等,规则如下:
lua
-- 合法的标识符
local name = "合法"
local userName = "合法"
local user_name = "合法"
local _private = "合法"
local _VERSION = "合法"
-- 非法的标识符
-- local 2name = "非法" -- 不能以数字开头
-- local user-name = "非法" -- 不能包含连字符
-- local class = "非法" -- 不能使用关键字
3.2 命名规范 #
lua
-- 变量:小写,下划线分隔
local user_name = "张三"
local max_count = 100
local is_valid = true
-- 常量:全大写,下划线分隔
local MAX_SIZE = 1024
local PI = 3.14159
local DEFAULT_TIMEOUT = 30
-- 函数:小写,下划线分隔
function get_user_info()
-- ...
end
function calculate_total()
-- ...
end
-- 类/模块:驼峰命名
local UserManager = {}
local HttpHandler = {}
-- 私有成员:下划线前缀
local _internal_state = {}
local function _helper_function()
-- ...
end
-- 布尔变量:is/has/can 前缀
local is_active = true
local has_permission = false
local can_edit = true
3.3 避免的命名 #
lua
-- 避免使用内置变量名
-- _G 全局表
-- _VERSION Lua 版本
-- arg 命令行参数
-- 避免使用下划线开头加大写
-- _NAME 可能与 Lua 内部变量冲突
-- 推荐的替代方案
local my_version = "1.0"
local app_name = "MyApp"
四、关键字 #
4.1 保留字列表 #
Lua 有 21 个保留字,不能用作标识符:
lua
and break do else elseif end
false for function goto if in
local nil not or repeat return
then true until while
4.2 关键字分类 #
控制结构:
lua
if then elseif else end -- 条件语句
for do end -- 数值 for 循环
while do end -- while 循环
repeat until -- repeat 循环
break -- 跳出循环
goto -- 跳转
逻辑运算:
lua
and -- 逻辑与
or -- 逻辑或
not -- 逻辑非
定义与声明:
lua
function -- 函数定义
local -- 局部变量声明
值:
lua
true -- 布尔真
false -- 布尔假
nil -- 空值
其他:
lua
in -- 泛型 for 循环
return -- 返回
4.3 关键字使用示例 #
lua
-- if-then-else
if condition then
-- 代码
elseif other_condition then
-- 代码
else
-- 代码
end
-- for 循环
for i = 1, 10 do
print(i)
end
-- while 循环
while condition do
-- 代码
end
-- repeat-until
repeat
-- 代码
until condition
-- 函数定义
function name(params)
return value
end
-- 逻辑运算
if a and b then
-- a 和 b 都为真
end
if a or b then
-- a 或 b 为真
end
if not a then
-- a 为假
end
五、作用域 #
5.1 全局变量 #
lua
-- 不使用 local 声明的变量是全局变量
name = "全局变量"
function show_name()
print(name) -- 可以访问全局变量
end
show_name() -- 全局变量
5.2 局部变量 #
lua
-- 使用 local 声明的变量是局部变量
local name = "局部变量"
function show()
local name = "函数内局部变量"
print(name) -- 函数内局部变量
end
show()
print(name) -- 局部变量
5.3 作用域规则 #
lua
local x = 1 -- 外层 x
do
local x = 2 -- 内层 x(遮蔽外层)
print(x) -- 2
do
local x = 3 -- 最内层 x
print(x) -- 3
end
print(x) -- 2
end
print(x) -- 1
5.4 最佳实践 #
lua
-- 推荐:总是使用 local
local name = "Lua"
local function greet()
print("Hello, " .. name)
end
-- 避免:全局变量污染
-- name = "Lua" -- 不推荐
-- 局部变量访问更快
local print = print -- 缓存全局函数
local table = table -- 缓存全局表
for i = 1, 1000000 do
print(i) -- 使用缓存的局部变量
end
六、表达式 #
6.1 算术表达式 #
lua
local a = 10
local b = 3
print(a + b) -- 加法:13
print(a - b) -- 减法:7
print(a * b) -- 乘法:30
print(a / b) -- 除法:3.333...
print(a // b) -- 整除:3
print(a % b) -- 取余:1
print(a ^ b) -- 幂运算:1000
print(-a) -- 负号:-10
6.2 关系表达式 #
lua
local a = 10
local b = 20
print(a == b) -- 等于:false
print(a ~= b) -- 不等于:true
print(a < b) -- 小于:true
print(a > b) -- 大于:false
print(a <= b) -- 小于等于:true
print(a >= b) -- 大于等于:false
6.3 逻辑表达式 #
lua
local a = true
local b = false
print(a and b) -- 与:false
print(a or b) -- 或:true
print(not a) -- 非:false
-- 短路求值
local x = false and print("不会执行")
local y = true or print("不会执行")
-- 实用技巧
local name = nil
print(name or "默认名称") -- 默认名称
local value = 0
print(value or "默认值") -- 0(0 是真值)
6.4 字符串连接 #
lua
local a = "Hello"
local b = "World"
print(a .. " " .. b) -- Hello World
print("数字:" .. 42) -- 数字:42
-- 多行字符串连接
local text = "第一行\n" ..
"第二行\n" ..
"第三行"
print(text)
6.5 表构造 #
lua
-- 空表
local t1 = {}
-- 数组风格
local t2 = {1, 2, 3, 4, 5}
-- 字典风格
local t3 = {name = "Lua", version = 5.4}
-- 混合风格
local t4 = {
1, 2, 3,
name = "混合",
["key"] = "value"
}
-- 嵌套表
local t5 = {
person = {
name = "张三",
age = 25
},
scores = {90, 85, 92}
}
七、语句 #
7.1 赋值语句 #
lua
-- 单变量赋值
local x = 10
-- 多变量赋值
local a, b = 1, 2
-- 交换变量
a, b = b, a
-- 函数返回多值
local function get_coords()
return 10, 20
end
local x, y = get_coords()
-- 值不足时补 nil
local m, n = 1
print(m, n) -- 1 nil
-- 值多余时忽略
local p = 1, 2, 3
print(p) -- 1
7.2 局部声明 #
lua
-- 单个变量
local x = 10
-- 多个变量
local a, b, c = 1, 2, 3
-- 先声明后赋值
local x, y
x = 10
y = 20
-- 函数声明
local function greet()
print("Hello!")
end
7.3 控制语句 #
lua
-- if 语句
if score >= 90 then
print("优秀")
elseif score >= 60 then
print("及格")
else
print("不及格")
end
-- while 循环
local i = 1
while i <= 10 do
print(i)
i = i + 1
end
-- repeat-until 循环
local i = 1
repeat
print(i)
i = i + 1
until i > 10
-- 数值 for 循环
for i = 1, 10 do
print(i)
end
-- 泛型 for 循环
local t = {a = 1, b = 2, c = 3}
for k, v in pairs(t) do
print(k, v)
end
八、代码风格指南 #
8.1 缩进 #
lua
-- 使用 4 个空格(推荐)
function example()
if condition then
do_something()
end
end
-- 或使用 Tab(团队统一即可)
function example()
if condition then
do_something()
end
end
8.2 行长度 #
lua
-- 每行不超过 80 字符
-- 长表达式换行
local result = very_long_function_name(
arg1, arg2, arg3,
arg4, arg5
)
-- 长字符串换行
local message = "这是一个很长的字符串," ..
"需要分成多行来写," ..
"以提高可读性。"
8.3 空行 #
lua
-- 函数之间空一行
function func1()
-- ...
end
function func2()
-- ...
end
-- 逻辑块之间空一行
local data = load_data()
-- 处理数据
for _, item in ipairs(data) do
process(item)
end
-- 输出结果
print_result()
8.4 表格式 #
lua
-- 短表:单行
local colors = {"red", "green", "blue"}
-- 长表:多行,对齐
local config = {
host = "localhost",
port = 8080,
timeout = 30,
max_conn = 100,
}
-- 嵌套表:缩进
local server = {
name = "main",
config = {
host = "localhost",
port = 8080,
},
routes = {
{path = "/", handler = index},
{path = "/api", handler = api},
},
}
九、常见陷阱 #
9.1 全局变量污染 #
lua
-- 错误:忘记 local
function counter()
count = 0 -- 这是全局变量!
count = count + 1
return count
end
-- 正确:使用 local
function counter()
local count = 0
count = count + 1
return count
end
9.2 nil 访问 #
lua
-- 错误:访问 nil 的字段
local t = {}
print(t.x.y) -- 错误:attempt to index field 'x' (a nil value)
-- 正确:先检查
if t.x and t.x.y then
print(t.x.y)
end
-- 或使用安全访问模式
local function safe_get(t, ...)
local current = t
for _, key in ipairs({...}) do
if type(current) ~= "table" then
return nil
end
current = current[key]
end
return current
end
print(safe_get(t, "x", "y"))
9.3 数值精度 #
lua
-- 注意浮点数精度
local a = 0.1 + 0.2
print(a == 0.3) -- false
-- 正确的比较方式
local function almost_equal(x, y, epsilon)
epsilon = epsilon or 1e-10
return math.abs(x - y) < epsilon
end
print(almost_equal(0.1 + 0.2, 0.3)) -- true
十、总结 #
本章介绍了 Lua 的基础语法:
- 程序结构:注释、变量、函数、语句
- 注释:单行注释
--和多行注释--[[ ]] - 标识符:命名规则和规范
- 关键字:21 个保留字
- 作用域:全局变量和局部变量
- 表达式:算术、关系、逻辑表达式
- 语句:赋值、声明、控制语句
- 代码风格:缩进、命名、格式规范
掌握这些基础知识后,你就可以开始编写 Lua 程序了。下一章,我们将深入学习 Lua 的数据类型。
最后更新:2026-03-27