Lua 教程(详细教程)

什么是 Lua?为什么它值得学习?

在众多编程语言中,Lua 可能不像 Python 或 JavaScript 那样家喻户晓,但它却像一位低调的“幕后英雄”,在游戏开发、嵌入式系统和配置脚本领域默默支撑着许多大型项目。如果你曾玩过《魔兽世界》《愤怒的小鸟》或者《Roblox》,那背后很可能就有 Lua 的身影。

Lua 的核心优势在于轻量级、高效、易于嵌入。它的解释器只有几百 KB,却能提供完整的编程能力。它不像 C++ 那样复杂,也不像 JavaScript 那样需要浏览器环境。你可以把它看作是“嵌入式脚本的瑞士军刀”——小巧、灵活、即插即用。

对于初学者来说,Lua 是一个绝佳的入门语言。语法简洁,学习曲线平缓,但又足够强大,能胜任实际项目开发。对于中级开发者,它能帮助你理解脚本语言的设计哲学,掌握如何在 C/C++ 等系统语言中嵌入逻辑控制。

本篇 Lua 教程将带你从零开始,逐步掌握 Lua 的核心语法、数据结构、函数机制和实际应用场景,让你不仅能“会写”,更能“懂用”。


基础语法与变量

Lua 的语法设计得非常直观,几乎像写自然语言一样。我们先从最基础的变量声明和赋值开始。

-- 声明一个变量 name,赋值为 "Alice"
local name = "Alice"

-- 声明一个数字变量 age,赋值为 25
local age = 25

-- 声明一个布尔值变量 is_student,赋值为 true
local is_student = true

-- 输出变量内容,用于调试或查看结果
print("姓名:" .. name .. ",年龄:" .. age .. ",是否学生:" .. tostring(is_student))

说明

  • local 关键字用于声明局部变量,防止污染全局环境。这是良好的编程习惯。
  • .. 是字符串拼接操作符,Lua 中没有 + 来连接字符串。
  • tostring() 是类型转换函数,将布尔值 true 转为字符串 "true",便于打印。
  • 所有语句以分号结尾是可选的,但推荐使用以增强可读性。

注意:Lua 是动态类型语言,变量类型由值决定,无需显式声明。比如你可以在运行时把 age 从数字改为字符串:

age = "二十五"  -- 现在 age 是字符串类型
print("年龄现在是:" .. age)

这种灵活性让 Lua 在处理配置文件或运行时逻辑时非常方便。


数据类型与结构:表(Table)

在 Lua 中,表(Table) 是最核心的数据结构,它相当于其他语言中的“字典”、“数组”或“对象”。你可以把它想象成一个“万能容器”——既能存键值对,也能存序列。

创建数组与初始化

-- 创建一个数组(索引从 1 开始)
local fruits = {"苹果", "香蕉", "橙子"}

-- 访问第一个元素(索引为 1)
print("第一个水果是:" .. fruits[1])

-- 添加新元素到数组末尾
table.insert(fruits, "葡萄")

-- 输出整个数组内容
for i = 1, #fruits do
    print("水果 " .. i .. ":" .. fruits[i])
end

说明

  • # 操作符用于获取表的长度(数组部分)。
  • table.insert() 是 Lua 标准库函数,用于向表中插入元素。
  • for 循环中 i = 1, #fruits 表示从 1 到表长度的迭代。

使用键值对创建字典

-- 创建一个包含键值对的表(类似 JSON 对象)
local person = {
    name = "张三",
    age = 30,
    city = "北京",
    is_married = false
}

-- 访问字段
print("姓名:" .. person.name)
print("城市:" .. person.city)

-- 修改字段
person.age = 31
print("更新后的年龄:" .. person.age)

-- 动态添加新字段
person.job = "程序员"
print("职业:" .. person.job)

说明

  • 表中使用 key = value 的形式定义键值对,键可以是字符串或数字。
  • 使用 . 操作符访问字段,如 person.name
  • 表是引用类型,多个变量可以指向同一个表实例,修改会同步。

函数定义与作用域

函数是 Lua 的核心构建模块。它支持匿名函数、多返回值和闭包,非常适合模块化开发。

定义与调用函数

-- 定义一个函数,计算两个数的和
function add(a, b)
    local result = a + b
    return result  -- 返回计算结果
end

-- 调用函数并打印结果
local sum = add(5, 3)
print("5 + 3 = " .. sum)

说明

  • function 关键字用于定义函数,后接函数名和参数列表。
  • local result 声明局部变量,避免污染全局作用域。
  • return 用于返回值,支持多个返回值(见下文)。

多返回值与解包

-- 函数返回多个值
function divide_and_remainder(dividend, divisor)
    local quotient = math.floor(dividend / divisor)
    local remainder = dividend % divisor
    return quotient, remainder  -- 返回两个值
end

-- 调用函数并解包返回值
local q, r = divide_and_remainder(17, 5)
print("17 除以 5 的商是:" .. q .. ",余数是:" .. r)

说明

  • Lua 函数可以返回多个值,调用方通过多个变量接收。
  • math.floor() 是数学库函数,向下取整。
  • % 是取模运算符,用于求余数。

控制流:条件与循环

控制流是程序逻辑的骨架。Lua 提供了简洁的 ifwhilefor 结构。

if 条件判断

local score = 85

if score >= 90 then
    print("优秀")
elseif score >= 80 then
    print("良好")
elseif score >= 60 then
    print("及格")
else
    print("不及格")
end

说明

  • elseif 是 else if 的简写,逻辑清晰。
  • Lua 中布尔值只有 truefalsenil 和空字符串 "" 都被视为假值。

while 循环

local count = 1

while count <= 5 do
    print("第 " .. count .. " 次循环")
    count = count + 1
end

说明

  • while 条件为真时持续执行循环体。
  • count = count + 1 是自增操作,类似 C 语言。

for 循环(步长循环)

-- 从 1 到 10,步长为 2
for i = 1, 10, 2 do
    print("奇数:" .. i)
end

说明

  • for i = start, end, step 的语法支持指定步长。
  • 步长为 1 时可省略,如 for i = 1, 10 do

实战案例:简易计算器

现在我们用前面学到的知识,写一个简单的命令行计算器。

-- 定义一个函数,执行四则运算
function calculate(a, op, b)
    if op == "+" then
        return a + b
    elseif op == "-" then
        return a - b
    elseif op == "*" then
        return a * b
    elseif op == "/" then
        if b == 0 then
            return nil, "错误:除数不能为零"
        end
        return a / b
    else
        return nil, "错误:不支持的运算符"
    end
end

-- 主程序循环
print("=== 简易计算器 ===")
print("支持:+、-、*、/,输入 'quit' 退出")

while true do
    print("请输入表达式(如:5 + 3):")
    local input = io.read()  -- 读取用户输入

    if input == "quit" then
        print("再见!")
        break
    end

    -- 使用字符串匹配解析输入
    local a, op, b = string.match(input, "(%d+)%s*([+-/*])%s*(%d+)")

    if a and op and b then
        a = tonumber(a)
        b = tonumber(b)

        local result, err = calculate(a, op, b)

        if result then
            print("结果:" .. result)
        else
            print(err)
        end
    else
        print("格式错误,请输入类似 '5 + 3' 的表达式")
    end
end

说明

  • string.match() 使用正则表达式提取数字和操作符。
  • io.read() 用于从控制台读取输入。
  • tonumber() 将字符串转换为数字。
  • break 用于跳出循环,实现退出逻辑。

这个计算器虽然简单,但涵盖了变量、函数、条件、循环、字符串处理等核心知识点,是学习 Lua 教程的绝佳实践。


总结:Lua 的价值与学习建议

Lua 虽小,却功能强大。它不是用来替代 Python 或 Java 的通用语言,而是为特定场景量身定制的“脚本引擎”。它的简洁性、高性能和可嵌入性,让它在游戏逻辑、配置管理、自动化脚本等领域大放异彩。

通过本篇 Lua 教程,你已经掌握了变量、表、函数、控制流等核心语法。下一步建议:

  • 尝试在 Roblox 或 Love2D 游戏引擎中使用 Lua 编写小游戏;
  • 阅读 Lua 官方文档,了解 stringtablemath 等标准库;
  • 学习如何在 C/C++ 程序中嵌入 Lua 脚本,体验“主程序 + 脚本控制”的架构。

记住:编程不是记忆语法,而是解决问题的能力。Lua 教程的终点,是你能用它写出真正有用的代码。