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 的基础语法:

  1. 程序结构:注释、变量、函数、语句
  2. 注释:单行注释 -- 和多行注释 --[[ ]]
  3. 标识符:命名规则和规范
  4. 关键字:21 个保留字
  5. 作用域:全局变量和局部变量
  6. 表达式:算术、关系、逻辑表达式
  7. 语句:赋值、声明、控制语句
  8. 代码风格:缩进、命名、格式规范

掌握这些基础知识后,你就可以开始编写 Lua 程序了。下一章,我们将深入学习 Lua 的数据类型。

最后更新:2026-03-27